【链接】
bzoj1022
【题目大意】
反Nim游戏。
【解题报告】
假设 sum 是所有数的 xor 值。
(1)、每堆都是 1 。
所以当
(2)、如果有两个堆且有堆里的个数不为
1
,其他都为
若先者拿走一堆,那么后者可以选择将另一堆留下 1 个或者全拿走,所以后者必胜;
若先者将一堆拿剩一个,那么后者可以选择将另一堆留下一个让先者拿或全拿走,所以后者必胜;
若先者将一堆拿走一部分,那么后者可以将另一堆同样拿走一部分,然后同上
由以上状态大概可以推知
如果所有堆全是
如果有堆不是
1
,
#include<cstdio>
#include<cstring>
using namespace std;
int T,n;
inline char nc()
{
static char buf[100000],*l,*r;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
if (l==r) return EOF; return *l++;
}
inline int Read()
{
int res=0; char ch=nc();
while (ch<'0'||ch>'9') ch=nc();
while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=nc();
return res;
}
void Work()
{
n=Read();int sum=0; int flg=0;
for (int i=1; i<=n; i++)
{
int x=Read(); sum^=x;
if (x^1) flg=1;
}
if ((flg&&sum)||(!flg&&!sum)) printf("John"); else printf("Brother"); putchar(10);
}
int main()
{
freopen("1022.in","r",stdin);
freopen("1022.out","w",stdout);
T=Read();
while (T--) Work();
return 0;
}