博弈论。
就是有一堆石子你拿走一堆中的一个,然后再向后面两堆中加两个问胜负
i<j<=k
所以我们可以直接通过sg函数计算,考虑问题的奇偶性,如果这一位是奇的我们才考虑,偶的可以模仿
然后对所有sg异或一下,找到三个数异或起来能使当前先手必败即可。
By:大奕哥
1 #include<bits/stdc++.h> 2 using namespace std; 3 int sg[25],a[25],v[105],n,cnt; 4 void init() 5 { 6 for(int i=1;i<=24;++i) 7 { 8 memset(v,0,sizeof(v)); 9 for(int j=1;j<i;++j) 10 for(int k=1;k<=j;++k) 11 { 12 v[sg[j]^sg[k]]=1; 13 } 14 int pos=0; 15 while(1) 16 { 17 if(!v[pos]){sg[i]=pos;break;} 18 pos++; 19 } 20 } 21 return; 22 } 23 int main() 24 { 25 init(); 26 while(~scanf("%d",&n)&&n) 27 { 28 int ans=0; 29 for(int i=1;i<=n;++i) 30 { 31 scanf("%d",&a[i]); 32 if(a[i]&1) 33 ans^=sg[n-i+1]; 34 } 35 printf("Game %d:",++cnt); 36 if(!ans) 37 puts(" -1 -1 -1"); 38 bool flag=0; 39 for(int i=1;i<n;++i) 40 if(a[i]&&!flag) 41 for(int j=i+1;j<=n;++j) 42 if(!flag) 43 for(int k=j;k<=n;++k) 44 if((ans^sg[n-i+1]^sg[n-j+1]^sg[n-k+1])==0) 45 { 46 printf(" %d %d %d\n",i-1,j-1,k-1); 47 flag=1;break; 48 } 49 } 50 return 0; 51 }