/*
n*m的 0、1图 只有 1 可以种草 每个草 不相邻(没有哪两块草地有公共边) 问有多少种方法分配
状态dp
f[i][p]:第i行 状态位p 的方案数
f[i][p]=f[i][p]+f[i-1][k]
*/
/*
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=1e8;
const int inf=0x3f3f3f3f;
ll n,m,mp[20],g[1<<15+10];
ll f[20][(1<<15)+10],ans;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int tmp;cin>>tmp;
mp[i]<<=1,mp[i]+=tmp;
}
}
// for(int i=1;i<=n;i++) cout<<mp[i]<<endl;
for(int i=0;i<(1<<m);i++){
if((i&(i<<1))==0 && (i&(i>>1))==0)
{
g[i]=1;
if((mp[1]&i)==i) f[1][i]=1;
}
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<(1<<m);j++)
{
if(g[j]&& (j&mp[i])==j)
{
for(int k=0;k<(1<<m);k++)
{
if(g[k]&& (k&mp[i-1])==k && (j&k)==0 )
{
f[i][j]=(f[i][j]+f[i-1][k])%mod;
}
}
}
}
}
for(int i=0;i<(1<<m);i++)
ans=(ans+f[n][i])%mod;
cout<<ans<<'\n';
return 0;
}