简单的状态压缩
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define INF 1000000009
#define _ std::ios_base::sync_with_stdio(0);cin.tie(0);
#define REP(i,nn) for (int i = 0; i < int(nn); ++ i)
#define REPI(i,aa,nn) for (int i = int(a); i < int(nn); ++ i)
#define maxn 19
#define MOD 100000000
using namespace std;
typedef long long ll;
int state[4000], cur[20];
int dp[20][4000];
int p;
int main() {_
int m, n;
while (cin >> n >> m) {
memset(dp, 0, sizeof(dp));
p = 0;
for (int i = 0; i < (1 << m); ++ i) {
if (!(i & (i << 1))) state[p++] = i;
}
//for (int i = 0; i < p; ++ i) cout << state[i] << endl;
for (int i = 0; i < n; ++ i) {
int tmp = 0;
for (int j = 0; j < m; ++ j) {
int tt;
cin >> tt;
if (tt == 0)
tmp += (1 << (m-j-1));
}
cur[i] = tmp;
//cout << tmp << endl;
}
for (int i = 0; i < p; ++ i) {
if ((state[i] & cur[0]) == 0) {
dp[0][i] = 1;
}
}
for (int i = 1; i < n; ++ i) {
for (int j = 0; j < p; ++ j) {
if (state[j] & cur[i]) continue;
for (int k = 0; k < p; ++ k) {
if (state[k] & cur[i-1]) continue;
if (state[k] & state[j]) continue;
dp[i][j] = (dp[i][j] + dp[i-1][k]) % MOD;
}
}
}
int res = 0;
for (int i = 0; i < p; ++ i) {
res += dp[n-1][i];
res %= MOD;
}
cout << res << endl;
}
}