rt
#include <bits/stdc++.h>
#define int long long
#define min(x, y) (x < y ? x : y)
#define max(x, y) (x > y ? x : y)
#define lowbit(x) (x & -x)
using namespace std;
const int DM[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1};
const int HASHMOD = 9223372036854775783;
const int HASHBASE = 131;
const int HASHITEM = 999997;
const int MOD = 1e8;
inline void read(int &res)
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - 48;
ch = getchar();
}
res = x * f;
}
struct Node
{
int bit[20], siz = 0;
} ground[20];
int n, m, a[20][20], dp[20][16384];
void pre(int l, int bit)
{
int cnt = 0;
for (int i = 0; i < 1 << m; i++)
{
if (i & bit || i & (i << 1) || i & (i >> 1))
{
continue;
}
// ground[l].siz++;
// ground[l].bit[ground[l].siz] = i;
ground[l].bit[++cnt] = i;
}
ground[l].siz = cnt;
}
int DamnPee()
{
for (int i = 1; i <= ground[1].siz; i++)
{
dp[1][i] = 1;
}
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= ground[i].siz; j++)
{
for (int k = 1; k <= ground[i - 1].siz; k++)
{
if (ground[i].bit[j] & ground[i - 1].bit[k])
continue;
dp[i][j] += dp[i - 1][k];
dp[i][j] %= MOD;
}
}
}
int res = 0;
for (int i = 1; i <= ground[n].siz; i++)
{
res = (res + dp[n][i]) % MOD;
// cout<<ground[n].bit[i]<<'\n';
}
return res % MOD;
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
int sum = 0;
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
sum = (sum << 1) + (!a[i][j]);
}
pre(i, sum);
}
cout << DamnPee();
return 0;
}
还有为什么 pre() 中的 ground[l].bit[++cnt]=i 改成 ground[l].bit[++ground[l].siz]=i 并删掉 ground[l].siz=cnt 会多 WA 几个点啊