#include <stdio.h>
#include <stdlib.h>
int n, m, inx=0;
long long int ***dp, *situation, *count;
void init(){
scanf("%d %d", &n, &m);
dp=(long long int***)malloc(sizeof(long long int**)*(n+1));
for(int i=0;i<=n;i++){
dp[i]=(long long int**)malloc(sizeof(long long int*)*(1+(1<<n)));
for(int j=0;j<=(1<<n);j++){
dp[i][j]=(long long int*)malloc(sizeof(long long int)*(m+1));
for(int k=0;k<=m;k++) dp[i][j][k]=0;
}
}
situation=(long long int*)malloc(sizeof(long long int)*(1+(1<<n)));
for(long long int i=0;i<=(1<<n);i++) situation[i]=0;
count=(long long int*)malloc(sizeof(long long int)*(1+(1<<n)));
for(long long int i=0;i<=(1<<n);i++) count[i]=0;
}
void dfs(int x, int num, int node){
if(node>=n){
situation[++inx]=x;
count[inx]=num;
return;
}
dfs(x, num, node+1);
dfs(x+(1<<node), num+1, node+2);
}
int judge(int index1, int index2){
if(situation[index1] & situation[index2]) return 0;
if(situation[index1] & (situation[index2]<<1)) return 0;
if((situation[index1]<<1) & situation[index2]) return 0;
return 1;
}
void dp_search(){
for(int j=1;j<=inx;j++) dp[1][j][count[j]]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=inx;j++){
for(int x=1;x<=inx;x++){
if(!judge(j, x)) continue;
for(int k=count[j];k<=m;k++) dp[i][j][k]+=dp[i-1][x][k-count[j]];
}
}
}
}
void output(){
long long int ans=0;
for(int i=1;i<=inx;i++) ans+=dp[n][i][m];
printf("%lld\n", ans);
}
void free_arr(){
for(int i=0;i<=n;i++) for(int j=0;j<=(1<<n);j++) free(dp[i][j]);
for(int i=0;i<=n;i++) free(dp[i]);
free(dp), free(situation), free(count);
}
int main(){
init();
dfs(0, 0, 0);
dp_search();
output();
free_arr();
return 0;
}