记录编号 536253 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 Gravatarleon 是否通过 通过
代码语言 C++ 运行时间 0.040 s
提交时间 2019-07-07 11:48:33 内存使用 5.23 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
int n,K,s[1<<11],c[1<<11],tot=0;
long long f[2][1<<11][26]={0},ans=0;
void DFS(int p,int last,int now,int cnt){
	if(p==n){
		tot++;s[tot]=now;c[tot]=cnt;return;}
	DFS(p+1,0,now<<1,cnt);
	if(!last){
		DFS(p+1,1,now<<1|1,cnt+1);}}
int main(){
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
	scanf("%d%d",&n,&K);
	DFS(0,0,0,0);
	f[0][1][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=tot;j++){
			for(int p=1;p<=tot;p++){
				for(int k=c[j]+c[p];k<=K;k++){
					if(!(s[p]&s[j])&&!(s[p]&(s[j]>>1))&&!(s[p]&(s[j]<<1))&&k-c[j]>=c[p]){
						f[i&1][j][k]+=f[1-i&1][p][k-c[j]];}}}}
		memset(f[1-i&1],0,sizeof(f[1-i&1]));}
	for(int i=1;i<=tot;i++){
		ans+=f[n&1][i][K];}
	printf("%lld",ans);
	return 0;
}