最後のボトル内のすべてのチョコレートは、あなたが操作することができず、この時間が状態は失敗する運命にされたときにまず最初に見つけることができます。
チョコレートの各ボトルのために、金型であることに注意してください\(2 \) FLACを模倣上側の手元操作することができますので、チョコレート豆の数はに変換されるため、重要性を検討するために行く(0 \)\または\(1 \) 。
そして、分割処理を検討し、場所は\(I \)チョコレート豆の位置を分割する\(I \)将来的には二つの位置、そして最終的には達するだろう(N \)\この位置に、転送を振り返ることができます(ニム\)\フェッチ操作石のゲーム。
その後、分割のように見ることができる\(ニム\)ゲームで石の山は、このプロパティ、我々はできることで、その後、石の小さな山に分割されて\(O(N ^ 3) \) 取得する\(SG \ )の価値それ。
番号と辞書最小直接暴力プログラムを評価することは、正当な動作次に、最初の操作の後、フリップを残しする故障状態に運命にある場合、列挙することができます。
コードを参照するには具体的な実現。
\(コード:\)
#include<bits/stdc++.h>
#define maxn 100
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int T,n,ans,tot,flag;
int p[maxn],sg[maxn];
bool vis[maxn];
void SG()
{
for(int i=n-1;i;--i)
{
memset(vis,false,sizeof(vis));
for(int j=i+1;j<=n;++j)
for(int k=j;k<=n;++k)
vis[sg[j]^sg[k]]=true;
int t=0;
while(1)
{
if(!vis[t])
{
sg[i]=t;
break;
}
t++;
}
}
}
int main()
{
read(T);
while(T--)
{
read(n),sg[n]=ans=tot=flag=0;
for(int i=1;i<=n;++i) read(p[i]);
SG();
for(int i=1;i<=n;++i)
if(p[i]%2)
ans^=sg[i];
for(int i=1;i<=n;++i)
{
if(!p[i]) continue;
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(!flag)
{
flag=true;
printf("%d %d %d\n",i-1,j-1,k-1);
}
}
}
}
}
if(!flag) puts("-1 -1 -1");
printf("%d\n",tot);
}
return 0;
}