您的位置:首页 > 其它

[SG函数] BZOJ1188: [HNOI2007]分裂游戏

2017-11-26 16:20 405 查看
可以发现,一颗石子可以看作是一个独立的游戏。

n 很小,瞎暴力求 SG 函数就好啦。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=105;
int _test,n,allsg,a[maxn],sg[maxn],vis[maxn],clk,ans,ans1,ans2,ans3;
int main(){
scanf("%d",&_test);
while(_test--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sg
=0;
for(int i=n-1;i>=1;i--){
clk++;
for(int j=i+1;j<=n;j++)
for(int k=j;k<=n;k++) vis[sg[j]^sg[k]]=clk;
for(int j=0;j<=100;j++) if(vis[j]!=clk){ sg[i]=j; break; }
}
ans1=ans2=ans3=ans=0;
for(int i=n-1;i>=1;i--) if(a[i])
for(int j=n;j>=i+1;j--)
for(int k=n;k>=j;k--){
a[i]--; a[j]++; a[k]++;
allsg=0; for(int t=1;t<=n;t++) allsg^=(a[t]&1)*sg[t];
if(allsg==0){ ans++; ans1=i; ans2=j; ans3=k; }
a[i]++; a[j]--; a[k]--;
}
printf("%d %d %d\n%d\n",ans1-1,ans2-1,ans3-1,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: