CF77D Domino Carpet

题目描述

……电视麦克又来和你打招呼啦! 厌倦了千篇一律的家具?厌烦了灰色的日常?梦想着在你谦逊的住所里来个头晕目眩的大变样?我们有东西向你推荐! 只需 99.99 美元,这块多米诺地毯就能改变你的人生!你可以把它铺在地板上,挂在墙上,甚至贴在天花板上!除此之外…… 看完了广告,病毒 Hexadecimal 也想要一块多米诺地毯,还一心想着在地毯前拍张照。当然了,病毒是绝不会同意花钱买正版地毯的!于是她订了一卡车多米诺骨牌,准备自己动手做这样一块地毯。 原版的多米诺地毯是一块 $n \times m$ 的方格。每个格子都是一个多米诺的一半,并且每个格子可以独立地纵向或横向旋转。纵向放置的多米诺格子如下图: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF77D/24b223911e7d414b4105f5f7b384a2c2404033bc.png) 横向放置的多米诺格子如下图: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF77D/2e953cc07e102d1dc6925e21d1623a202ee1f98f.png) 注意,有些格子经过旋转后形态不变,但有些则有所不同。 Hexadecimal 买到的多米诺骨牌都是不能切割的 $1 \times 2$ 小块,可以横着也可以竖着放。如果竖着放,那么两半都要是竖向的;如果横着放,两半都必须是横向的。 下面是多米诺竖放和横放时,合法与非法的示例: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF77D/5374017256a96c5a451a244dd383a369135da2b6.png) 病毒 Hexadecimal 制作自己的多米诺地毯时,要求满足下列条件: - 地毯的每个格子都被一个多米诺骨牌覆盖,即没有空格; - 所有多米诺骨牌都完全放在地毯上,且互不重叠; - 如果有一个横放的多米诺,其左半部分在第 $j$ 列,则第 $j-1$ 列和第 $j+1$ 列都不能再有左半部分在该列的横放多米诺。 在开始拼装多米诺地毯之前,病毒想知道有多少种满足上述条件的拼装方式,答案需对 $10^9 + 7$ 取模。 你可以假定骨牌的类型和数量都是无限的。

输入格式

第一行包含两个整数 $n$ 和 $m$,用空格隔开,表示多米诺地毯的尺寸($1 \leq n, m \leq 250$)。接下来的 $4n + 1$ 行,每行包含 $4m + 1$ 个字符。 地毯上的每个格子(即一个多米诺的半格)由一个 $3 \times 3$ 的区域描述。这一区域中字符 ‘O’ 表示对应位置有点,‘.’ 表示没有点。 相邻格子之间用字符 ‘#’ 分隔,如示例所示。 保证每个 $3 \times 3$ 区域都合法地描述了某种多米诺的一半。 在所有预测试数据中,多米诺地毯的尺寸为 $2 \times 2$ 和 $4 \times 4$。

输出格式

输出一个整数,表示用标准 $1 \times 2$ 多米诺骨牌覆盖整块地毯、同时满足所有条件的不同拼法数量,结果对 $10^9+7$ 取模。

说明/提示

对第一个样例的说明:所有合法的多米诺地毯拼法如下图所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF77D/981dbdf83cacdc8575134f74d310175de347a9dc.png) 而下图的拼法是不合法的: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF77D/e27d2b360b8d6e5a93ae8ba6b82c2ca4f625b27b.png) 由 ChatGPT 5 翻译