//挺有意思的一道题 写一个简略的题解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=12;
const int M=1<<N;
bool st[M];
long long dp[N][M];
int n,m;
int main(void)
{
while(cin>>n>>m,n||m)
{
for(int i=0;i<(1<<n);i++) //预处理某一列的状态,每一列的每一个格子有两种状态,一共有n行,所以有2的n次方种状态。
{
st[i]=true;
int cnt=0;
for(int j=0;j<n;j++)
{
if(i>>j&1)
{
if(cnt&1)
{st[i]=false;
break;}
else cnt=0;
}
else cnt++;
}
if(cnt&1) st[i]=false;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=m;i++) //把每一列都遍历一遍
{
for(int j=0;j<(1<<n);j++)
{
for(int k=0;k<(1<<n);k++)
{
if((j&k)==0&&st[j|k]) //k表示第i-1列的某一种状态,j表示第i列的某一种状态,两种状态只要有一种为1(即有方块堵着)则不行,故用|;
dp[i][j]+=dp[i-1][k];
}
}
}
cout<<dp[m][0]<<endl;
}
}
好耶