[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 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11832936.html