白金元首与莫斯科
题号:NC15207
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

在一个 n x m 的网格区域中存在一个陆军单位需要补给,区域中的每个格子为空地或障碍物中的一种。航空舰队需要派遣若干运输机前往此区域,每一架运输机可以向两个相邻(有一条公共边)的空地投放物资。为防止不必要的损坏,一个标记为空地的格子至多只能得到一次投放。
由于天气原因,陆军单位所在的确切位置并不能确定。因此元首想知道,对于每个空地格子,当陆军单位在其中(视作障碍物)时,用若干(可以为 0)架运输机向其余空地投放任意数量的物资的不同方案数。两个投放方案不同,当且仅当存在一个格子在一个方案中被投放而另一方案中未被投放,或存在两个被投放的格子,在一个方案中被同一架运输机投放而在另一方案中非然。若仍有疑问,请参考【样例 1 解释】。
你需要编写程序帮助元首计算这些值。

输入描述:

输入的第一行包含一个正整数 T —— 数据的组数。接下来包含 T 组数据,格式如下,数据间没有空行。
- 第 1 行:两个空格分隔的正整数 n, m —— 网格区域的行数和列数。
- 接下来 n 行:其中第 i 行包含 m 个空格分隔的整数 Ai1, Ai2, ..., Aim —— 其中 Aij = 0 表示第 i 行第 j 列的格子为空地;Aij = 1 表示该格为障碍物

输出描述:

对于每组数据输出 n 行,第 i 行包含 m 个空格分隔的整数 Bi1, Bi2, ..., Bim —— 若第 i 行第 j 列的格子为空地,Bij 为该格变为障碍物后投放的方案数;否则 Bij = 0。
示例1

输入

复制
2 4
0 0 0 0
0 0 0 1

输出

复制
14 13 10 22
15 11 17 0

说明

以第 2行第 1列的空地格为例,其变为障碍物后的网格如下图,其中白色格子代表空地,黑色格子代表障碍物。

15种方案如下图所示,不同颜色代表不同运输机的投放位置。

备注: