记录编号 |
87741 |
评测结果 |
AAAAAAAAAA |
题目名称 |
放国王 |
最终得分 |
100 |
用户昵称 |
Chenyao2333 |
是否通过 |
通过 |
代码语言 |
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;
}