定义:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则, 为利己态,用S表示。[定理 1]:对于任何一个S态,总能从一堆火柴中取出若干个使之成为T态。这就是说从A(t)堆中取出 A(t) - x 根火柴后状态就会从S态变为T态。[定理 2]:T态,取任何一堆的若干根,都将成为S态。[定理 3]:S态,只要方法正确,必赢。 [定理 4]:T态,只要对方法正确,必败。定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态,用T0表示。[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。 [定理6]:S1态,只要方法正确,必胜。若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜。[定理7]:S2态不可转一次变为T0态。[定理8]:S2态可一次转变为T2态。[定理9]:T2态,只能转变为S2态或S1态。 [定理10]:S2态,只要方法正确,必胜. 综上所述, 必输态: T2,S0 必胜态: S2,S1,T0.
#include <iostream>
using namespace std;
int main()
{
int cas;
cin>>cas;
while(cas--)
{
int n;
cin>>n;
int ans=0;
int k=0;
int m;
while(n--)
{
cin>>m;
if(m>1)
k++;
ans=ans^m;
}
if(k==0)
{
if(!ans)
cout<<"John"<<endl;
else
cout<<"Brother"<<endl;
}
else
{
if(ans)
cout<<"John"<<endl;
else
cout<<"Brother"<<endl;
}
}
return 0;
}