经典例题不多说了。
ACcode:
#include<cstdio>
#include<cstring>
typedef long long LL;
const int NS=1000000;
LL dp[12][1<<10];
int state[NS][2],top;
void build(int pre,int now,int pos,int lim)
{
if (pos>lim) return ;
if (pos==lim)
{
state[top][0]=pre;
state[top++][1]=now;
return ;
}
build(pre<<2,now<<2,pos+2,lim);
build(pre<<1|1,now<<1,pos+1,lim);
build(pre<<1,now<<1|1,pos+1,lim);
}
LL solve(int n)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for (int j=1;j<=n;j++)
for (int i=0;i<top;i++)
dp[j][state[i][1]]+=dp[j-1][state[i][0]];
return dp[n][0];
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m),n+m)
{
if ((n*m)&1)
{
printf("0\n");
continue;
}
if (n<m) m=n^m,n=n^m,m=m^n;
top=0,build(0,0,0,m);
printf("%lld\n",solve(n));
}
return 0;
}