记录编号 87741 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2014-02-09 13:05:54 内存使用 21.10 MiB
显示代码纯文本
#include<stdio.h>

typedef long long LL;

const int MAXN=10+1;
const int MAXW=1<<MAXN;
const int MAXK=MAXN*MAXN;

int N,K;

int way[MAXW];int w_n=0;
int ci[MAXW];

inline int get_1(int i){
	int num=0;
	while(i){
		if(i&1)num++;
		i>>=1;
	}
	return num;
}

void get_way(int n){
	for(int i=0;i<(1<<n);i++){
		if( !((i<<1)&i) ){
			way[w_n]=i;
			ci[w_n++]=get_1(i);
		}
	}
}

LL f[MAXN][MAXW][MAXK]={0};

void test(){
	for(int i=1;i<=N;i++){
		for(int s=0;s<w_n;s++){
			for(int k=0;k<=K;k++){
				if(f[i][way[s]][k]){
					printf("i:%d s:%d k:%d f:%d\n",i,way[s],k,f[i][way[s]][k]); 
				}
			}
		}
	}
}

LL solve(){
	get_way(N);
	f[0][0][0]=1;
	for(int i=1;i<=N;i++){
		for(int j=0;j<w_n;j++){//上行状态 
			for(int k=0;k<w_n;k++){//该行状态 
		 		int jj=way[j];int kk=way[k];
				if((( (jj<<1)|(jj>>1)|jj )&kk))continue;
				for(int c=ci[k];c<=K;c++){
					f[i][kk][c]+=f[i-1][jj][c-ci[k]];
					//if(f[2][2][2]){
					//	printf("kk:%d jj:%d\n",kk,jj);
					//}
				}
			}
		}
	}
	
	//test();
	
	LL ans=0;
	for(int i=0;i<w_n;i++)ans+=f[N][way[i]][K];
	return ans;
}

void open(){
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
}

int main(){
	open();
	scanf("%d %d",&N,&K);
	LL ans=solve();
	printf("%lld",ans);
	return 0;
}