发现每颗豆子是独立的,所以我们可以对每颗豆子单独考虑(看作一个组合游戏).
然后直接SG即可.
#include <cstdio>
const int N=22;
int t,n,ans,x,y,z,cnt;
int sg[N],p[N];
int main(){
for(int i=1;i<N;i++){
bool h[N*N]={0};
for(int j=i-1;j>=0;j--)
for(int k=j;k>=0;k--)
h[sg[j]^sg[k]]=1;
for(int j=0;;j++){
if(!h[j]){
sg[i]=j;
break;
}
}
}
scanf("%d",&t);
while(t--){
ans=cnt=x=y=z=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
for(int j=1;j<=p[i];j++) ans^=sg[n-i];
}
if(!ans){
printf("-1 -1 -1\n0\n");
continue;
}
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[n-i]^sg[n-j]^sg[n-k])){
cnt++;
if(!(x|y|z)){x=i-1;y=j-1;z=k-1;}
}
}
}
}
printf("%d %d %d\n%d\n",x,y,z,cnt);
}
return 0;
}