来源:POJ2411
居然卡精度。。。WA了我那么多次
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N =12;
const int MAXN = (1<<N)+10;
int n,m;
long long dp[N][MAXN];
bool judge(int x){
int ans=0;
//cout<<"X: "<<x<<endl;
while(x){
if(x&1) ans++;
else {
if(ans&1) return false;
ans=0;
}
x>>=1;
//cout<<"x: "<<x<<endl;
}
//cout<<"ans: "<<endl;;
if(ans&1) return false;
else return true;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
//cout<<n<<" "<<m<<endl;
/*if((n&1)&&(m&1)){
puts("0");
continue;
}*/
int cnt=(1<<m);
memset(dp,0,sizeof(dp));
//memset(st,0,sizeof(st));
for(int i=0;i<cnt;i++){
if(judge(i))
dp[1][i]=1;
}
for(int i=1;i<n;i++){
//cout<<i<<endl;
for(int j=0;j<cnt;j++){
//cout<<j<<endl;
if(dp[i][j]!=0){
for(int k=0;k<cnt;k++){
//cout<<k<<endl;
if( (j|k)==cnt-1 && judge(j&k)){
dp[i+1][k]+=dp[i][j];
//cout<<"k"<<endl;
}
}
}
}
}
cout<<dp[n][cnt-1]<<endl;
}
return 0;
}