#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 13, M = 1 << 10, K = 103;
typedef long long ll;
ll f[N][K][M];//前N行已经放了K个国王且最后一行的状态是S
vector<int> state;//存储不含相邻两个1的合法状态
int cnt[M];//每个状态中1的个数
vector<int> head[M];//每个合法状态对应的合法状态
int n, m;
bool check(int x)//是否满足不包含相邻两个1的状态
{
for (int i = 0; i < n; i++)
if ((x >> i & 1) && (x >> (i + 1) & 1))
return false;
return true;
}
int count(int x)
{
int res = 0;
for (int i = 0; i < n; i++)
if (x >> i & 1)
res++;
return res;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < 1 << n; i++) //预处理出不含有相邻两个1的状态
{
if (check(i))
{
state.push_back(i);
cnt[i] = count(i);
}
}
//预处理出每个合法状态对应的合法状态
for (int i = 0; i < state.size(); i++)
{
for (int j = 0; j < state.size(); j++)
{
int a = state[i], b = state[j];
if ((a & b) == 0 && check(a | b))
head[a].push_back(b);
}
}
f[0][0][0] = 1;
for (int i = 1; i <= n + 1; i++)//枚举行
{
for (int j = 0; j <= m; j++)//枚举国王数量
{
for (int s = 0; s < state.size(); s++)//枚举状态
{
int a = state[s];
for (int b:head[a])//枚举每个状态对应的合法状态
{
int k = cnt[a];
if (j >= k)
f[i][j][a] += f[i - 1][j - k][b];
}
}
}
}
cout << f[n + 1][m][0];
/*cout << endl;
for (int i = 1; i <= n + 1; i++)
{
for (int j = 0; j <= m; j++)
{
for (int s = 0; s < state.size(); s++)
{
int a = state[s];
cout << f[i][j][a] << ' ';
}
cout << endl;
}
cout << endl;
}
*/
return 0;
}