//思路就是:状压,从上到下铺dfs,sta表示本行的状态,next表示下一行的状态,每次要把sta铺满
//,next随之变化。最后要m+1行的状态为0才可以。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[11][1<<10];
int n,m;
bool chak(int sta,int x){
int tmp=(sta&(1<<x));
return !tmp;
}
void dfs(int sta,int next,int col,int row,ll w){
if(col==n){
dp[row+1][next]+=w;
return;
}
if(sta&(1<<col)) dfs(sta,next,col+1,row,w); //不放
else{
int st=(sta|(1<<col));
if(chak(next,col)){
dfs(sta|(1<<col),next|(1<<col),col+1,row,w);//竖着的1*2
if(col+1<n&&chak(sta,col+1))
dfs(st|(1<<(col+1)),next|(1<<col),col+1,row,w);//缺右上角的2*2
st=(next|(1<<col));
if(col+1<n&&chak(next,col+1))
dfs(sta|(1<<col),st|(1<<(col+1)),col+1,row,w);//缺右下角的2*2
if(col-1>=0&&chak(next,col-1))
dfs(sta|(1<<col),st|(1<<(col-1)),col+1,row,w);//缺左下角的2*2
}
st=(sta|(1<<col));
if(col+1<n&&chak(sta,col+1)){
dfs(st|(1<<(col+1)),next,col+1,row,w);//横着的1*2
if(chak(next,col+1))
dfs(st|(1<<(col+1)),next|(1<<(col+1)),col+1,row,w);//缺左上角的2*2
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)==2){
memset(dp,0,sizeof(dp));
dp[1][0]=1;
int N=(1<<n);
for(int i=1;i<=m;i++){
for(int j=0;j<N;j++){
if(dp[i][j])
dfs(j,0,0,i,dp[i][j]);
}
}
printf("%lld\n",dp[m+1][0]);
}
return 0;
}