#include<bits/stdc++.h>
using namespace std;
unsigned long long n,m,a[3111],f[21][411][3111];
bool P[3111],K[21][21];
bool Can(unsigned long long M,unsigned long long B){
for(unsigned long long i=0;i<m;i++){
if((M&(1<<i))&&!K[B][i]){
return 0;
}
}
return 1;
}
int main(){
cin>>n>>m;
for(unsigned long long i=1;i<=n;i++){
for(unsigned long long j=0;j<m;j++){
cin>>K[i][j];
}
}
for(unsigned long long i=0;i<=(1<<m)-1;i++){
for(unsigned long long j=0;j<m;j++){
if(i&(1<<j)){
a[i]++;
}
}
if(!(((i<<1)|(i>>1))&i)){
P[i]=1;
}
}
f[0][0][0]=1;
for(unsigned long long i=1;i<=n;i++){
for(unsigned long long A=0;A<=(1<<m)-1;A++){
if(P[A]&&Can(A,i)){
for(unsigned long long B=0;B<=(1<<m)-1;B++){
if(P[B]&&Can(B,i-1)){
if(!(B&A)){
for(unsigned long long j=a[A];j<=i*m;j++){
f[i][j][A]+=f[i-1][j-a[A]][B];
f[i][j][A]%=100000000;
}
}
}
}
}
}
}
unsigned long long ans=0;
for(unsigned long long i=0;i<=(1<<m)-1;i++){
for(unsigned long long j=0;j<=n*m;j++){
ans+=f[n][j][i];
ans%=100000000;
}
}
cout<<ans;
}