/*
都说状压裸题,可我感觉好难的样子......
f[i][j]表示第i行状态为j时的方案数
1.39~43行 预处理每行状态(二进制,若状态和里有2^i,说明i号格子可以种)
2.19~23行 判断第一行的可行状态 相邻不能都种 && 枚举出来的状态可达 f[1][i]=1;
3.25~32行 dp 枚举行和每行状态 若上一行j状态可达,就转移,枚举转移到的状态k。
判断: 与上面不相同:(j&k)==0; 与右边不相同: (k&(k>>1))==0 状态可达: (k|mp[i])==mp[i]
方程: f[i][k]=(f[i][k]+f[i-1][j])%mod;
4.37行 累加每一行答案
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 100000000
using namespace std;
int mp[13],f[13][4096];
int ans,ed,n,m,x;
void dp()
{
for(int i=0;i<=ed;i++)
{
if((i&(i>>1))==0 && (i|mp[1])==mp[1])
f[1][i]=1;
}
for(int i=2;i<=m;i++) for(int j=0;j<=ed;j++)
{
if(f[i-1][j])
for(int k=0;k<=ed;k++)
{
if((j&k)==0 && (k|mp[i])==mp[i] && (k&(k>>1))==0)
f[i][k]=(f[i][k]+f[i-1][j])%mod;
}
}
for(int i=0;i<=ed;i++) ans+=f[m][i],ans%=mod;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++)
{
scanf("%d",&x);
mp[i]<<=1;mp[i]+=x;
}
ed=(1<<n)-1;dp();
printf("%d\n",ans);
return 0;
}