记录编号 581607 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2023-08-08 16:16:51 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = (1<<10)+10,M = 110;
int n,m;
long long f[2][N][M],ans;
int s[N],cnt[N],u[N];
void sou(int x,int la,int now,int Cnt){
	if(x == n){
		s[0]++;
	    s[s[0]] = now,cnt[s[0]] = Cnt;
		return;
	}
	sou(x+1,0,now<<1,Cnt);
	if(!la)sou(x+1,1,(now<<1)+1,Cnt+1); 
}
int main(){
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
	scanf("%d%d",&n,&m);
	sou(0,0,0,0);
	for(int i = 1;i <= s[0];i++){
	    for(int j = 0;j < n;j++){
	    	int t = (1<<j);
	    	if(s[i] & t)
	    		u[i] |= t | (t<<1) | (t>>1);
		}
	}
	f[0][1][0] = 1;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= s[0];j++){
			for(int k = cnt[j];k <= m;k++){
				for(int p = 1;p <= s[0];p++){
					if(!(s[p]&u[j]) && k-cnt[j] >= cnt[p]){
						f[i&1][j][k] += f[(i-1)&1][p][k-cnt[j]];
					}
				}
			}
		}
		memset(f[(i-1)&1],0,sizeof(f[(i-1)&1]));
	}
	for(int i = 1;i <= s[0];i++)ans += f[n&1][i][m];
	printf("%lld\n",ans);
	
	return 0;
	
}