#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MOD = 100000000;
int M, N; vector<vector> grid; vector validStates; vector<vector> dp;
// 检查一个状态是否有效(没有相邻的1) bool isValidState(int state) {
return (state & (state << 1)) == 0;
}
// 检查一个状态是否与当前行的土地状态兼容 bool isCompatibleWithRow(int state, int row) {
for (int i = 0; i < N; ++i) {
if (state & (1 << i)) {
if (grid[row][i] == 0) {
return false;
}
}
}
return true;
}
// 检查两个状态是否兼容(没有相邻的1) bool areStatesCompatible(int state1, int state2) {
return (state1 & state2) == 0;
}
int main() {
cin >> M >> N;
grid.resize(M, vector<int>(N));
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
cin >> grid[i][j];
}
}
// 预处理所有有效的状态
for (int state = 0; state < (1 << N); ++state) {
if (isValidState(state)) {
validStates.push_back(state);
}
}
// 初始化DP数组
dp.resize(M + 1, vector<int>(1 << N, 0));
dp[0][0] = 1;
// 逐行处理
for (int i = 1; i <= M; ++i) {
for (int prevState : validStates) {
if (dp[i - 1][prevState] == 0) continue;
for (int currState : validStates) {
if (isCompatibleWithRow(currState, i - 1) && areStatesCompatible(prevState, currState)) {
dp[i][currState] = (dp[i][currState] + dp[i - 1][prevState]) % MOD;
}
}
}
}
// 计算所有可能的最终状态的总和
int total = 0;
for (int state : validStates) {
total = (total + dp[M][state]) % MOD;
}
cout << total << endl;
return 0;
}