记录编号 |
174166 |
评测结果 |
AAAAAAAAAA |
题目名称 |
放国王 |
最终得分 |
100 |
用户昵称 |
forever |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.018 s |
提交时间 |
2015-07-31 16:13:13 |
内存使用 |
5.62 MiB |
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,k,z[3600],tot,num[2500];
long long f[12][520][111];
int sd(int y){
int sum=0;
while(y){
if(y>0){
if(y&1)
sum++;
y>>=1;
}
}
return sum;
}
int main(){
freopen("placeking.in","r",stdin);
freopen("placeking.out","w",stdout);
scanf("%d%d",&n,&k);
for(int x=0;x<(1<<n);++x){
if(x&(x<<1))
continue;
else
{
z[++tot]=x;
num[tot]=sd(x);
}
}
for(int i=1;i<=tot;++i)
f[1][i][num[i]]=1;
for(int i=2;i<=n;++i){
for(int j=1;j<=tot;++j)
{ for(int r=0;r<=k;++r)
{
//if(f[i-1][j][r]==0) continue;
for(int h=1;h<=tot;++h){
if((z[h]&z[j])||(z[h]&(z[j]<<1))||(z[h]&(z[j]>>1)))
continue;
if(r+num[h]>k) continue;
else
f[i][h][r+num[h]]+=f[i-1][j][r];
}
}
}
}
long long ans=0;
for(int i=1;i<=tot;++i)
ans+=f[n][i][k];
printf("%lld",ans);
}