#include<iostream>
#include<cstring>
using namespace std;
int f[13][5000],cnt=0,num[5000],st[100010];//f[i][s]表示第i行以s的方式摆的方案总数
int n,m,gr[14];//gr是每行草地的状态 m是列,n是行
//st[]负责存储互不相邻的奶牛状态
//cnt是合法的状态数量
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
int a;
cin>>a;
gr[i]=(gr[i]<<1)+a;
}
}
for(int s=0;s<(1<<n);s++){
if(!(s<<1&s)&&!(s>>1&s)){
st[++cnt]=s;
}
}
// for(int i=0;i<=cnt;i++) cout<<st[i]<<" ";
// cout<<endl;
f[0][0]=1;
for(int i=1;i<=m;i++){
for(int l=1;l<=cnt;l++){
int s1=st[l];//当前行的状态
if((s1&gr[i])==s1) //可以种植
for(int r=1;r<=cnt;r++){
int s2=st[r];
if((s1&s2)==0){//上下不重合
f[i][s1]+=f[i-1][s2];
}
}
}
}
long long ans=0;
for(int i=1;i<=cnt;i++){
ans+=f[n][st[i]];
}
cout<<ans;
}