#include<cstdio>
#include<iostream>
#include<bits/stdc++.h>
#define go(i,a,b) for(int i=a;i<=b;i++)
const int mx=100000000;
using namespace std;
int m,n,f[13],ans,dp[14][1<<13];
bool vis[13][1<<13];
struct node{
int x,x1,y,d,last;
int *val;
bool operator < (const node&a)const
{
return d>a.d;
}
}p;
int bfs(){
priority_queue<node> q;
q.push(node{0,f[1],f[2],2,0,&dp[1][f[1]]});
while(!q.empty()){
p=q.top();
int now=p.x;int v=p.x1;int next=p.y;int d=p.d;int lt=p.last;int val=*p.val;int *po=p.val;q.pop();
if(d<=m&&vis[d][next]==0){q.push(node{0,next,f[d+1],d+1,0,&dp[d][next]});vis[d][next]=1;}
if(now==0)dp[d][next]+=val;
for(int i=(~v)&((1<<n)-1);i!=0;i=i-(i&-i)){
int x=now,y=next,vv=v;
int t=log2(i&-i);
if(t>=lt){
x=x^(1<<t);
if(t<n-1&&t>=1)vv=vv|(7<<(t-1));
else if(t==n-1) vv=vv|(3<<(t-1));
else if(t==0) vv=vv|3;
y=y|(1<<t);
dp[d][y]=(dp[d][y]%mx+val%mx)%mx;
q.push(node{x,vv,y,d,t,po});
}
}
}
for(int i=0;i<=((1<<n)-1);i++)ans=(dp[m+1][i]%mx+ans%mx)%mx;
return ans;
}
int main(){
cin>>m>>n;
go(i,1,m){
go(j,0,n-1){
int a;
cin>>a;
if(a==0)f[i]=(1<<j)^f[i];
}
}
dp[1][f[1]]=1;
cout<<bfs();
return 0;
}
求加题解