#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL N,K;
LL st[600],tot;
LL dp[10][600][100];//i行状态为j已经摆放了k个棋子的方案数
LL sum(LL x)
{
LL ans=0;
for(LL i=0; i<N; i++)if((x>>i)&1)ans++;
return ans;
}
int main()
{
cin>>N>>K;
for(LL i=0; i<1<<N; i++)
if(!(i&(i<<1)))st[tot++]=i;
for(LL i=0; i<tot; i++)dp[1][i][sum(st[i])]=1;
for(LL i=2; i<=N; i++) //行
{
for(LL j=0; j<tot; j++) //这一列的状态
{
for(LL k=0; k<tot; k++) //上一行的状态
{
if(st[j]&st[k]||st[j]&(st[k]<<1)||st[k]&(st[j]<<1))continue;
LL cnt1=sum(st[j]);
LL cnt2=sum(st[k]);
for(LL f=0; f<=K&&f+cnt1<=K; f++) //已经摆放了多少
{
if(cnt2>f)continue;
dp[i][j][f+cnt1]+=dp[i-1][k][f];
}
}
}
}
LL ans=0;
for(LL i=0; i<tot; i++)ans+=dp[N][i][K];
cout<<ans;
return 0;
}
P1896
最新推荐文章于 2022-04-10 09:06:12 发布