#include<bits/stdc++.h>
using namespace std;
#define SET0(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define DWN(i,a,b) for(int i=(a);i>=(b);i--)
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 12,M = 1<<10, K = 110; //分别表示第n行 当前行的状态 在相应状态下总共放置棋子的个数
int n,m;
ll f[N][K][M]; //见上
int cnt[M]; //表示相应状态中棋子的个数(比如cnt[3]对应的01串是 11 则cnt[3]=2 (因为有两个1))
vector<int> state; //储存合法序列
vector<int> head[M]; //储存合法状态转移的关系的vector
int lowbit(int x){return x&-x;}
int cal(int x){
int res=0;
while(x){
x-=lowbit(x);
res++;
}
return res;
} //计算x 对应01串 1的个数
bool check(int x){
FOR(i,0,n-1)
if(x>>i&1 && x>>i+1&1) return false;
return true;
} //验证状态x对应的01序列是否合法
int main(){
cin>>n>>m;
FOR(i,0,(1<<n)-1)
if(check(i)){
cnt[i]=cal(i); //计算合法(01)序列中1的个数
state.push_back(i); //储存合法序列
}
FOR(i,0,state.size()-1)
FOR(j,0,state.size()-1)
if(!(state[i]&state[j]) && check(state[i]|state[j])) //更新
head[i].push_back(j);
f[0][0][0]=1; //初始化
FOR(i,1,n+1)
FOR(j,0,m)
FOR(a,0,state.size()-1){
for(int k=0;k<head[a].size();k++){
int b=head[a][k];
if(cnt[state[a]]<=j){
f[i][j][a]+=f[i-1][j-cnt[state[a]]][b];
}
}
}
cout<<f[n+1][m][0];
return 0;
}