Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 9975 | Accepted: 5772 |
Description
Input
Output
Sample Input
1 2 1 3 1 4 2 2 2 3 2 4 2 11 4 11 0 0
Sample Output
1 0 1 2 3 5 144 51205
Source
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; __int64 N,M,cur; __int64 d[2][1<<11]; __int64 num[1<<11]; void DFS(__int64 x,__int64 pos,__int64 flag) { if(pos==M) { if(!flag) num[++num[0]]=x; return ; } DFS(x,pos+1,flag^1); if(flag==0) DFS(x|1<<pos,pos+1,flag); } int main() { __int64 i,j,k,tmp; while(scanf("%I64d%I64d",&N,&M),N||M) { if(N<M) swap(N,M); if(M==1) { if(N%2) printf("0\n"); else printf("1\n"); continue; } if(M%2 && N%2) { printf("0\n"); continue; } num[0]=0; DFS(0,1,1); DFS(1,1,0); cur=0; memset(d[cur],0,sizeof(d[cur])); d[cur][0]=1; for(i=0;i<N;i++) { cur^=1; memset(d[cur],0,sizeof(d[cur])); for(j=1;j<=num[0];j++) { for(k=0;k<(1<<M);k++) { if((num[j]&k)!=k) continue; d[cur][num[j]^k]+=d[cur^1][k]; } } } printf("%I64d\n",d[cur][0]); } return 0; }
#include<cstdio> #include<cstring> using namespace std; __int64 H,W,cur; __int64 d[2][1<<11]; void updata(__int64 a,__int64 b) { if(a&(1<<W)) { d[cur][a^(1<<W)]+=d[cur^1][b]; } } int main() { __int64 i,j,k,tmp,Max; while(scanf("%I64d%I64d",&H,&W),H||W) { if(H<W) { tmp=H; H=W; W=tmp; } cur=0; memset(d[cur],0,sizeof(d[cur])); d[cur][(1<<W)-1]=1; for(i=1;i<=H;i++) for(j=1;j<=W;j++) { cur^=1; memset(d[cur],0,sizeof(d[cur])); for(k=0;k<(1<<W);k++) { updata(k<<1,k); if(i>1 && !(k&(1<<(W-1))) ) updata( (k<<1)|1|(1<<W) ,k); if(j>1 && !(k&1)) updata( (k<<1)|3,k ); } } printf("%I64d\n",d[cur][(1<<W)-1]); } return 0; }