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

来源:互联网 发布:smtp tls 端口 编辑:程序博客网 时间:2024/06/04 19:25

可以发现,一颗石子可以看作是一个独立的游戏。
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[n]=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;}
原创粉丝点击