#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int H,W;
int t[30][30],u[30][30];
ll dfs(int y,int x){
  if(x==W)return dfs(y+1,0);
  if(y==H)return 1;
  if(t[y][x]==1)return dfs(y,x+1);
  ll res=0;
  if(x+1<W&&t[y][x]==0&&t[y][x+1]==0){
    if(u[y][x]<2&&u[y+1][x]<2&&u[y][x+2]<2&&u[y+1][x+2]<2){
      u[y][x]++;u[y+1][x]++;u[y][x+2]++;u[y+1][x+2]++;
      t[y][x]=t[y][x+1]=1;
      res+=dfs(y,x+1);
      t[y][x]=t[y][x+1]=0;
      u[y][x]--;u[y+1][x]--;u[y][x+2]--;u[y+1][x+2]--;
    }
  }
  if(y+1<H&&t[y][x]==0&&t[y+1][x]==0){
    if(u[y][x]<2&&u[y+2][x]<2&&u[y][x+1]<2&&u[y+2][x+1]<2){
      u[y][x]++;u[y+2][x]++;u[y][x+1]++;u[y+2][x+1]++;
      t[y][x]=t[y+1][x]=1;
      res+=dfs(y,x+1);
      t[y][x]=t[y+1][x]=0;
      u[y][x]--;u[y+2][x]--;u[y][x+1]--;u[y+2][x+1]--;
    }
  }
  return res;
}

int main(){
  while(1){
    cin>>H>>W;
    if(H==0&&W==0)break;
    cout<<dfs(0,0)<<endl;
  }
  return 0;
}
### Prompt

Your task is to create a Cpp solution to the following problem:

A tatami mat, a Japanese traditional floor cover, has a rectangular form with aspect ratio 1:2. When spreading tatami mats on a floor, it is prohibited to make a cross with the border of the tatami mats, because it is believed to bring bad luck.

Your task is to write a program that reports how many possible ways to spread tatami mats of the same size on a floor of given height and width.



Input

The input consists of multiple datasets. Each dataset cosists of a line which contains two integers H and W in this order, separated with a single space. H and W are the height and the width of the floor respectively. The length of the shorter edge of a tatami mat is regarded as a unit length.

You may assume 0 < H, W ≤ 20.

The last dataset is followed by a line containing two zeros. This line is not a part of any dataset and should not be processed.

Output

For each dataset, print the number of possible ways to spread tatami mats in one line.

Example

Input

3 4
4 4
0 0


Output

4
2

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int H,W;
int t[30][30],u[30][30];
ll dfs(int y,int x){
  if(x==W)return dfs(y+1,0);
  if(y==H)return 1;
  if(t[y][x]==1)return dfs(y,x+1);
  ll res=0;
  if(x+1<W&&t[y][x]==0&&t[y][x+1]==0){
    if(u[y][x]<2&&u[y+1][x]<2&&u[y][x+2]<2&&u[y+1][x+2]<2){
      u[y][x]++;u[y+1][x]++;u[y][x+2]++;u[y+1][x+2]++;
      t[y][x]=t[y][x+1]=1;
      res+=dfs(y,x+1);
      t[y][x]=t[y][x+1]=0;
      u[y][x]--;u[y+1][x]--;u[y][x+2]--;u[y+1][x+2]--;
    }
  }
  if(y+1<H&&t[y][x]==0&&t[y+1][x]==0){
    if(u[y][x]<2&&u[y+2][x]<2&&u[y][x+1]<2&&u[y+2][x+1]<2){
      u[y][x]++;u[y+2][x]++;u[y][x+1]++;u[y+2][x+1]++;
      t[y][x]=t[y+1][x]=1;
      res+=dfs(y,x+1);
      t[y][x]=t[y+1][x]=0;
      u[y][x]--;u[y+2][x]--;u[y][x+1]--;u[y+2][x+1]--;
    }
  }
  return res;
}

int main(){
  while(1){
    cin>>H>>W;
    if(H==0&&W==0)break;
    cout<<dfs(0,0)<<endl;
  }
  return 0;
}
```