#include<cstdio>
using namespace std;/*
题目大意:
给定n*m块地,每一块地有一个状态,1表示可以种植,0表示不能种植,如果一块地种植了,
相邻的地不能种植,问有多少种种植方式。
思路:
定义dp[][],第一维表示当前行,第二维表示当前行的种植状态。
dp[i][j]表示第i行种植状态为j时的方案数。
预处理一行的每块地都为可种植时可以种植的状态,从第二行开始dp,每一行的状态只受上
一行状态和当前行每块地的状态的影响。
*/typedeflonglong ll;constint mod =1e8;int G[15][15];int dp[15][1<<12];int s[1<<12];intjudge(int state,int r,int c)// 判断第r行每块地的状态能不能满足状态state{for(int i = c; i >=1; i--){if((state &1)==1&& G[r][i]==0){return0;}
state >>=1;}return1;}intmain(){int n, m;scanf("%d%d",&n,&m);for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){scanf("%d",&G[i][j]);}}// 预处理int cnt =0;for(int i =0; i <(1<< m); i++){if((i &(i <<1))==0){
s[++cnt]= i;}}for(int i =1; i <= cnt; i++){if(judge(s[i],1, m)){
dp[1][i]=1;}}for(int i =2; i <= n; i++){for(int j =1; j <= cnt; j++){for(int k =1; k <= cnt; k++){if((s[j]& s[k])||!judge(s[j], i, m))continue;
dp[i][j]=(dp[i][j]+ dp[i -1][k])% mod;}}}int ans =0;for(int i =1; i <= cnt; i++){
ans =(ans + dp[n][i])% mod;}printf("%d\n", ans);return0;}