#include<bits/stdc++.h>
using namespace std;
int n,k;
long long ans;
#define MAXK 2005
#define MAXN 15
#define MAXST 2005
bool unconflict(int i,int j){
return (!(j&i)&&(!j&(i<<1)&&(!j&(i>>1))));
}
int getint1(int st){
int tmp=0;
for(int i=1;i<=(1<<10);i<<=1){
if(i&st){
tmp++;
}
}
return tmp;
}
bool legal[MAXST];
long long dper[MAXN][MAXST][MAXK];
int cntk[MAXST],now;
int main(){
scanf("%d %d",&n,&k);
const int maxk=(1<<n);
int i2;
memset(cntk,0,sizeof(cntk));
for(int i=0;i<maxk;i++){
i2=i;
legal[i]=unconflict(i,i);
now=0;
cntk[i]=getint1(i);
if(legal[i]&&cntk[i]<=k){
dper[1][i][cntk[i]]=1;
printf("flag cntk[i]=%d i=%d\n",cntk[i],i);
}
}
for(int i=2;i<=n;i++){
for(int sti=0;sti<maxk;sti++){
if(!legal[sti]){
continue;
}
for(int stj=0;stj<maxk;stj++){
if(unconflict(sti,stj)){
int ki=cntk[sti];
for(int kj=cntk[stj];kj+ki<=k;kj++){
dper[i][sti][ki+kj]+=dper[i-1][stj][kj];
}
}
}
}
}
for(int i=0;i<maxk;i++){
ans+=dper[n][i][k];
}
for(int i=1;i<=n;i++){
for(int j=0;j<=maxk;j++){
for(int l=1;l<=100;l++){
printf("%d ",dper[i][j][l]);
}
printf("\n");
}
printf("\n");
}
printf("%lld\n",ans);
return 0;
}