#include<iostream>
#include<cstring>
using std::cin;
using std::cout;
#define N 10
#define signed register int
int n,m,status[N],tot;//方案及方案总数
long long f[N][2<<N][N*N],ans;
inline int cnt(int x)//统计二进制下1的数量
{
int ret=0;
while(x)
{
if(x&1)++ret;
x>>=1;
}
return ret;
}
inline bool checks(int x)//判断本行是否冲突
{
if(x&(x<<1))return false;
if(x&(x>>1))return false;
return true;
}
int main()
{
std::ios::sync_with_stdio(false);
memset(status,0,sizeof(status));
memset(f,0,sizeof(f));
cin>>n>>m;
for(signed i=0;i<=(1<<n)-1;++i)
if(checks(i))status[++tot]=i;
for(signed i=1;i<=tot;++i)//边界条件
f[1][status[i]][cnt(status[i])]=1;
for(signed i=2;i<=n;++i)//行数
for(signed j=1;j<=tot;++j)//方案数
for(signed k=cnt(status[j]);k<=m;++k)//之前国王总数
for(signed h=1;h<=tot;++h)//上一行方案数(枚举)
{
int x=status[j],y=status[h];
if((x&y)||(x&(y>>1))||(x&(y<<1)))continue;
f[i][x][k]+=f[i-1][y][k-cnt(x)];
}
for(signed i=1;i<=tot;++i)
ans+=f[n][status[i]][m];
cout<<ans<<'\n';
return 0;
}
蒟蒻刚学状压,要疯了