/*
状态dp
n*n的棋盘 放k个国王 攻击8个临近格子 问有多少方法
f[i][p][k]前i行 NO i 状态 sit[p] 放了p个
f[i][p][k]=sum(f[i-1][L][k-sum(k)])
*/
/*
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e1;
ll f[20][2000][100],sit[2000],sta[200];
int k,n,cnt;
ll ans;
void dfs(int cur,int x,int num)
{
if(cur>=n+1){
sit[++cnt]=x;
sta[cnt]=num;
return;
}
dfs(cur+1,x,num);
dfs(cur+2,x+(1<<(cur-1)),num+1);
}
int cmp(int a,int b){
if(sit[a]&sit[b]) return 0;
if(sit[a]<<1&sit[b]) return 0;
if(sit[a]>>1&sit[b]) return 0;
return 1;
}
int getsum(int x)
{
int res=0;
while(x)
{
if(x&1) res++;
x>>=1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>k;
//dfs(1,0,0);
for(int i=0;i<(1<<n);i++){
if(i&(i>>1)||i&(i<<1)) continue;
sit[++cnt]=i,sta[cnt]=getsum(i);
}
for(int i=1;i<=cnt;i++) f[1][i][sta[i]]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=cnt;j++){
for(int x=1;x<=cnt;x++)
{
if(sit[j]&sit[x]||sit[j]&(sit[x]>>1)||sit[j]&(sit[x]<<1)) continue;
for(int l=sta[j];l<=k;l++)
f[i][j][l]+=f[i-1][x][l-sta[j]];
}
}
}
for(int i=1;i<=cnt;i++)
ans+=f[n][i][k];
cout<<ans<<'\n';
return 0;
}