您的位置:首页 > 其它

bzoj1188: [HNOI2007]分裂游戏

2017-04-02 15:45 239 查看
传送
4000


明显博弈论。

而且当且仅当a[i]&1时会影响sg函数

所以我们记忆化搜索求出sg函数。(暴力枚举分裂到的位置)

然后枚举第一步的方案,xor一下==0为合法方案。

代码超短。

#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int b[20005],sg[30],t,ans,tot,x,n;
inline void pre(){
sg[1]=0;
for (int i=2;i<26;i++){
memset(b,0,sizeof(b));
for (int j=1;j<i;j++)
for (int k=1;k<=j;k++) b[sg[j]^sg[k]]=1;
for (int j=0;;j++)
if (!b[j]){
sg[i]=j;
break;
}
}
}
int main(){
pre();
scanf("%d",&t);
while (t--){
scanf("%d",&n);
ans=tot=0;
for (int i=1;i<=n;i++){
scanf("%d",&x);
if (x%2) ans^=sg[n-i+1];
}
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
for (int k=j;k<=n;k++)
if (!(ans^sg[n-i+1]^sg[n-j+1]^sg[n-k+1])){
tot++;
if (tot==1) printf("%d %d %d\n",i-1,j-1,k-1);
}
if (!tot) printf("-1 -1 -1\n");
printf("%d\n",tot);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: