Description

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

Input

本题的输入由多组数据组成,第一行包括一个整数T,表示输入总共有T组数据(T≤500)。每组数据的第一行包括一个整数N(N≤50),表示共有N堆石子,接下来有N个不超过5000的整数,分别表示每堆石子的数目。

Output

每组数据的输出占一行,每行输出一个单词。如果约翰能赢得比赛,则输出“John”,否则输出“Brother”,请注意单词的大小写。

Sample Input

2
3
3 5 1
1
1

Sample Output

John
Brother

HINT

【数据规模】

对于40%的数据,T ≤ 250。

对于100%的数据,T ≤ 500。

博弈论

考虑特殊情况

每堆石子都是1时,如果堆数是奇数brother win,比如只有一堆石子且为1

考虑偶数堆相同的石子,此时xor值为0,此时先取的人可以取走一堆,后取得人也取走一堆变成少两堆的状态,如此往复

知道最后还有两堆,先手取1堆,后手取到只剩一个,由此当sg==0时后手胜

当sg!=0时,先手胜,因为先手必然能找到一中方法使sg==0

 #include<cstdio>
int T,n;
int main(){
scanf("%d",&T);
while(T--){
int num=,x,step=;bool flag=;
scanf("%d",&n);
for(int i=;i<=n;i++) {
scanf("%d",&x),num^=x;
if (x>)flag=;
step++;
}
if(flag){
if(num==) printf("Brother\n"); else printf("John\n");}
else if(step%==) printf("Brother\n");else printf("John\n");
}
}

最新文章

  1. MyEclipse对Maven的安装
  2. sass初级语法
  3. 数据库Sharding的基本思想和切分策略
  4. iOS系统tabbar图标出现重影问题
  5. Win 2003硬盘安全设置
  6. chromiun 学习《二》 目录结构 +启动流程
  7. 搭建OpenWrt开发环境(包括编译过程)
  8. MST:Conscription(POJ 3723)
  9. SDL2 Tutorial
  10. 利用DataImportHandler建索引时一直无法完成
  11. JDBC的使用五大步骤以及查询操作-数据库编程(二)
  12. AngularJS 最常用的几种功能
  13. 使用ansible kubectl插件连接kubernetes pod以及实现原理
  14. Hadoop日志文件
  15. JavaWeb初级进阶高级学习方向计划
  16. [UE4]判断2个向量是否相等
  17. 一个简单需求:HashMap实现相同key存入数据后不被覆盖
  18. 拉普拉斯平滑处理 Laplace Smoothing
  19. CentOS 7 :Failed to start IPv4 firewall with iptables.
  20. z-index层级顺序 opacity透明度 display: none 模态框实现

热门文章

  1. 关于Hadoop集群的搭建环境变量相关配置
  2. [改善Java代码]让多重继承成为现实
  3. [未完成][Mooc]关于线程的总结
  4. 【策略】UVa 1344 - Tian Ji -- The Horse Racing(田忌赛马)
  5. 转:Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解
  6. BZOJ 3831
  7. Apache ab 测试工具使用(一)
  8. Linux 命令 - printenv: 打印全部或部分环境信息
  9. Unity3D 之UGUI 滚动条
  10. Android经验之谈1