[bzoj1188]分裂游戏
容易发现所有豆子相互独立,只需要考虑每一个豆子的sg函数并异或起来即可,sg函数从后往前暴力即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,x,y,z,s,ans,a[105],sg[105],vis[105]; 4 int main(){ 5 scanf("%d",&t); 6 while (t--){ 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 9 memset(sg,0,sizeof(sg)); 10 x=y=z=s=ans=0; 11 for(int i=n;i;i--){ 12 memset(vis,0,sizeof(vis)); 13 for(int j=i+1;j<=n;j++) 14 for(int k=j;k<=n;k++)vis[sg[j]^sg[k]]=1; 15 while (vis[sg[i]])sg[i]++; 16 if (a[i]&1)s^=sg[i]; 17 } 18 for(int i=1;i<=n;i++) 19 if (a[i]) 20 for(int j=i+1;j<=n;j++) 21 for(int k=j;k<=n;k++) 22 if ((s==(sg[i]^sg[j]^sg[k]))&&(!ans++))printf("%d %d %d\n",i-1,j-1,k-1); 23 if (!ans)printf("-1 -1 -1\n"); 24 printf("%d\n",ans); 25 } 26 }