bzoj 1188 分裂游戏 博弈论

来源:互联网 发布:乎是不是多音字 编辑:程序博客网 时间:2024/05/18 00:54

同一堆里的每个豆子是相互独立的,sg[i]表示第i堆里一个豆子的sg值。
sg[i]=mex( sg[j]^sg[k] ) ;

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int n;int p[30],sg[30];int use[1000];int main(){    int T;scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&p[i]);        sg[n]=0;        int ans=0;        for(int i=n-1;i>=1;i--)        {            memset(use,0,sizeof(use));            for(int j=i+1;j<=n;j++)                for(int k=j;k<=n;k++)                    use[sg[j]^sg[k]]=1;            int j=0;while(use[j]) j++;            sg[i]=j;if(p[i]%2) ans^=sg[i];        }        if(ans==0)        {            puts("-1 -1 -1");puts("0");            continue;        }        int tot=0;        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[i]^sg[j]^sg[k])==0)                {                    tot++;                    if(tot==1)                        printf("%d %d %d\n",i-1,j-1,k-1);                }        }        printf("%d\n",tot);    }    return 0;}
1 0