#P17429. PM15896 骨牌铺放

PM15896 骨牌铺放

题目描述

对于每个正整数 kk,你都有无限多个大小为 1×k1\times k 的骨牌。每块骨牌既可以横放,也可以竖放。

现在有一个矩形棋盘,其中一些格子已经被 1×11\times1 的骨牌覆盖,其余格子为空。你需要使用上述骨牌将所有空格恰好覆盖。

一个覆盖方案是合法的,当且仅当每个格子恰好被一块骨牌覆盖,并且所有骨牌都完全位于棋盘内部。

如果两个覆盖方案中,存在两个格子 P,QP,Q,使得恰好只有一个方案中有同一块骨牌同时覆盖 P,QP,Q,则认为这两个方案不同。

求不同合法覆盖方案的数量,对 109+710^9+7 取模。

输入格式

第一行一个整数 HH,表示棋盘的行数。

接下来 HH 行,每行一个仅由 .# 组成的字符串,表示棋盘:

  • . 表示空格;
  • # 表示该格已经被覆盖,不能再放置骨牌。

所有字符串长度相同,记列数为 WW

输出格式

输出一个整数,表示不同合法覆盖方案数量对 109+710^9+7 取模后的结果。

数据范围

  • 1H×W3001\le H\times W\le300
  • 输入字符串只包含 .#

样例 1

1
..
2

样例 2

2
.#
..
3

样例 3

3
.#.
#..
...
20