状压DP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int MAXN = 3000;
bool f[MAXN];
ll dp[14][MAXN], n, m;
void dfs(int k, int cur) {
if(k == m){
f[cur] = 1;
return ;
}
dfs(k + 1, cur | (1<<k));
if(k <= m - 2) dfs(k + 2, cur);
}
int main() {
while(1) {
cin >> n >> m;
if(!n && !m) break;
memset(f, 0, sizeof(f));
dfs(0, 0);
/*for(int i = 0; i <= 100; i++) {
printf("%d %d\n",i, f[i]);
}*/
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
//for(int i = 0; i < (1 << m); i++) if(f[i]) dp[1][i] = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < (1 << m); j++) {
//if(f[j]) {
for(int k = 0; k < (1 << m); k++) {
if(f[k | j] && ((j & k) == 0)) {
dp[i + 1][k] += dp[i][j];
}
}
//}
}
}
cout << dp[n][0] << endl;
}
return 0;
}