记录编号 378138 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 GravatarMealy 是否通过 通过
代码语言 C++ 运行时间 0.063 s
提交时间 2017-03-03 08:28:13 内存使用 189.36 MiB
显示代码纯文本
//1517
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int nmax=110;
const int Nmax=1<<11;
const int Mmax=11;
ll s[1100]={0};
int c[1100]={0};
ll a[110]={0};
ll f[nmax][Nmax][nmax]={0};
int n,pn;
void DFS(int p,int tag,int tmp,int cnt){
	if(p==n){
		s[0]++;
		s[s[0]]=tmp;
		c[s[0]]=cnt;
		return;
	}
	DFS(p+1,0,tmp<<1,cnt);
	if(!tag){
		DFS(p+1,1,tmp<<1^1,cnt+1);
	}
}
void PreDo(){
	scanf("%d%d",&n,&pn);
//	printf("%d %d ",n,pn);
	DFS(0,0,0,0);
	f[0][1][0]=1;
}
bool Check(int a,int b){
	if(a&b){
		return 0;
	}
	if(a&(b<<1)){
		return 0;
	}
	if(a&(b>>1)){
		return 0;
	}
	return 1;
}

void Col(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=s[0];j++){
			for(int k=c[j];k<=pn;k++){
				for(int l=1;l<=s[0];l++){
					if(Check(s[l],s[j])&&k-c[j]>=c[l]){
						f[i][j][k]+=f[i-1][l][k-c[j]];
					}
				}
			}
		}
	}
	ll ans=0;
	for(int i=1;i<=s[0];i++){
		ans+=f[n][i][pn];
	}
	printf("%lld\n",ans);
}
int main(){
//	ll k=4896065419316;
//	printf("%lld\n",k);
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
	PreDo();
	Col();
	return 0;
}