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