题目背景
建议评棕。
题目描述
Yuki 有一个 n+2 行 m+2 列的棋盘,行的下标为 0∼n+1,列的下标为 0∼m+1。
棋盘上第 i 行第 j 列的格子用 (i,j) 表示,每个格子的颜色可能为白色或黑色,以 si,j 表示,si,j=0 则表示白色,si,j=1 则表示黑色。保证棋盘最外围一圈的格子颜色为白色,即保证 s0,i=sn+1,i=si,0=si,m+1=0。
Yuki 打算在棋盘上摆放若干个车。对于格子 (i,j),它被称作安全的,当且仅当存在至少一个车位于第 i 行或第 j 列,且格子 (i,j) 上不存在车。
Yuki 对车的摆放方案有如下要求:
- 所有车都位于黑色格子上;
- 任意两个车都不位于同一行或同一列;
- 卒从棋盘的第 0 行出发,不可以在只经过安全的格子的情况下到达棋盘的第 n+1 行。
其中,卒的行走方式为:设当前卒的位置为 (i,j),那么它可以走到 (i+1,j),(i,j−1),(i,j+1) 中的任意一个格子,只要这个目的地在棋盘内。
Yuki 需要你帮助她求出满足条件的摆放方案的数量。由于答案可能较大,你只需要求出答案对 109+7 取模后的结果。
输入格式
本题有多组测试数据。
输入的第一行包含一个正整数 t,c,分别表示测试数据组数和测试点编号。样例满足 c=0。
对于每组测试数据:
- 第一行包含两个正整数 n,m。
- 接下来 n 行,第 i 行包含一个长度为 m 的 01 串 si,1,…,si,m。
输出格式
对于每组测试数据,输出一行,包含一个整数表示答案。
3 0
2 2
11
00
2 2
01
01
3 3
100
000
001
3
3
4
提示
样例 1 解释
该样例共有 3 组测试数据。
对于第 1 组测试数据,3 种合法方案分别为:
- 不放车;
- 在 (1,1) 放车;
- 在 (1,2) 放车。
对于第 2 组测试数据,3 种合法方案分别为:
- 不放车;
- 在 (1,2) 放车;
- 在 (2,2) 放车;
对于第 3 组测试数据,4 种合法方案分别为:
- 不放车;
- 在 (1,1) 放车;
- 在 (3,3) 放车;
- 在 (1,1),(3,3) 放车。
样例 2
见附加文件中的 zu2.in 与 zu2.ans。
该样例共有 3 组测试数据。
其中第 1 组测试数据满足 n,m≤4,第 2 组测试数据满足 n≤100,m≤4,第 3 组测试数据满足 n≤200,m≤8。
样例 3
见附加文件中的 zu3.in 与 zu3.ans。
该样例共有 3 组测试数据。该样例所有测试数据满足 si,j=1。
其中第 1 组测试数据满足 n,m≤80,第 2 组测试数据满足 n,m≤300,第 3 组测试数据满足 n,m≤1500。
样例 4
见附加文件中的 zu4.in 与 zu4.ans。
该样例共有 3 组测试数据。
其中第 1 组测试数据满足 n,m≤80,第 2 组测试数据满足 n,m≤500,第 3 组测试数据满足 n,m≤3000。
数据范围
对于所有测试数据,保证:
- 1≤t≤3;
- 1≤n,m≤3000;
- si,j∈{0,1}。
对于 c 为奇数的测试点,保证 n=m。
::cute-table{tuack}
| 测试点编号 |
n≤ |
m≤ |
特殊性质 |
| 1∼4 |
100 |
4 |
否 |
| 5∼8 |
200 |
8 |
| 9,10 |
1 |
1500 |
| 11,12 |
1500 |
1 |
| 13,14 |
80 |
是 |
| 15,16 |
300 |
| 17,18 |
1500 |
| 19∼21 |
80 |
否 |
| 22,23 |
500 |
| 24,25 |
3000 |
特殊性质:对于所有 i∈[1,n],j∈[1,m],保证 si,j=1。