#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>
using namespace std;#define db double#define ll long long#define sc scanf#define pr printf#define fi first#define se second#define pb push_back#define m_p make_pair#define Pir pair<int, int>#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f3f3f3f3f/*==========ACMer===========*/constint N =15;
ll dp[N][1<< N];int h, w;voiddfs(int k,int now,int last,int i)//第 i 行的状态为 now,从第 i-1 行的 last 状态递推出来, 判读第 i-1 行第 k 列的那个格子是否已经被覆盖了, 并推测出第 i 行的第 k 个格子的状态{if(k > h)return;if(k == h){
dp[i][now]+= dp[i -1][last];return;}dfs(k +1, now <<1, last <<1|1, i);//如果第 i-1 行的第 k 个格子已经被占用了dfs(k +1, now <<1|1, last <<1, i);//如果第 i-1 行的第 k 个格子没有被占用dfs(k +2, now <<2|3, last <<2|3, i);//如果第 i-1 的第 k 和 k+1 个格子已经被占用了,那么我们也要推测出第 i 行的第 k 和 k+1 个格子可以被一个 竖着的2x1的正方形所覆盖}intmain(){while(sc("%d %d",&h,&w)&& h + w){if(h %2&& w %2){pr("0\n");continue;}if(h > w)swap(h, w);memset(dp,0,sizeof dp);
dp[0][(1<< h)-1]=1;for(int i =1; i <= w; i ++){dfs(0,0,0, i);}pr("%lld\n", dp[w][(1<< h)-1]);}return0;}