桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输。小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下谁将获得游戏的胜利。

sg函数是无法操作者输,这题却是无法操作者赢。

不妨考虑一下情况

  1. 每堆石子都是1个,个数为偶数时先手必胜(反之后手)
  2. 有且只有1堆石子大于1个,先手必胜
  3. 很多(至少2堆)石子大于一个,异或和为0时先手必败,否则必胜
    证:
    在情况3下,考虑如下策略:当异或和不为0时,一定将异或和取为0
    当异或和为0时,无论怎么取,都会使异或和不为0,
    这样胶着下去,直到在堆数刚好变到1堆的时刻,也就是情况2出现,
    显然情况2下,异或和 ≠0 ,于是此时异或和不为0的那一方获胜。
    证毕

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main()
{
// freopen("bzoj1022.in","r",stdin);
// freopen(".out","w",stdout);

int T=read();
For(k,T) {
int n=read(),t=0;
bool b=0;
For(i,n) {
int p=read();
if (p>1) b=1; else t^=p;
}
if (b||!t) puts("John"); else puts("Brother");
}


return 0;
}