#include using std::cin; using std::cout; const char endl = '\n'; const int N = 15, M = 0xfff + 5; // = (11111111111)2 + 5 const int mod = 1e8; int m, n, a[N], f[N][M], ans; bool s[M]; int main() { std::ios::sync_with_stdio(false); cin >> m >> n; for (int i = 1; i <= m; i++) { for (int j = 1, x; j <= n; j++) { cin >> x; a[i] <<= 1; a[i] += x; } } for (int i = 0; i < 0xfff; i++) { // 行内不存在相邻的草地 if (!((i << 1) & i) && !((i >> 1) & i)) { s[i] = true; } } f[0][0] = 1; for (int i = 1; i <= m; i++) { // 当前行的状态 for (int j = 0; j < 0xfff; j++) { // j 是合法的状态,且没有草被种在贫瘠的土地上 if (s[j] && (a[i] & j) == j) { // 枚举上一行的状态 for (int k = 0; k < 0xfff; k++) { if (!(k & j)) { // k 和 j 间不存在相邻的土地 f[i][j] = (f[i][j] + f[i - 1][k]) % mod; } } } } } for (int i = 0; i < 0xfff; i++) { ans = (ans + f[m][i]) % mod; } cout << ans << endl; return 0; }