http://poj.org/problem?id=2411
/*Óùö¶¯Êý×é*/
#include"iostream"
#include"string.h"
using namespace std;
long long dp[2][(1<<15)];
int N,M;
int check1(int x)
{
for(int j=0;j<M;)
{
if(x&(1<<j))
{
if(j==M-1)return 0;
else if(x&(1<<(j+1)))j+=2;
else if((x&(1<<(j+1)))==0)return 0;
}
else j++;
}
return 1;
}
int check2(int x1,int x2)
{
for(int j=0;j<M;)
{
if(x1&(1<<j))
{
if(x2&(1<<j))
{
if(j==M-1)return 0;
else if((x1&(1<<(j+1))) && (x2&(1<<(j+1))))j+=2;
else return 0;
}
else j++;
}
else
{
if(x2&(1<<j))j++;
else return 0;
}
}
return 1;
}
int main()
{
while(cin>>N>>M)
{
if(M==0&&N==0)break;
if(N&1&&M&1)
{
cout<<"0\n";
continue;
}
if(N<M)swap(N,M);
memset(dp,0,sizeof(dp));
for(int i=0;i<(1<<M);i++)
{
if(check1(i))
{
dp[0][i]=1;
}
}
int pre=0,now;
for(int i=1;i<N;i++)
{
now=pre^1;
memset(dp[now],0,sizeof(dp[now]));
for(int j=0;j<(1<<M);j++)
{
for(int k=0;k<(1<<M);k++)
{
if(check2(j,k))
{
dp[now][j]+=dp[pre][k];
}
}
}
pre=now;
}
cout<<dp[now][(1<<M)-1]<<"\n";
}
}