前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

作者头像
attack
发布2018-04-10 18:23:04
5400
发布2018-04-10 18:23:04
举报

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

裸的Anti-Nim游戏

直接上定理

先手必胜的条件

所有堆的石子数都为1且游戏的SG值为0

有些堆的石子数大于1且游戏的SG值不为0

代码语言:javascript
复制
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6+10,INF=1e9+10;
inline char nc()
{
    static char buf[MAXN],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    char c=nc();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
    return x*f;
}
int a[MAXN];
main()
{
    #ifdef WIN32 
    freopen("a.in","r",stdin);
    #else
    #endif
    int QWQ=read();
    while(QWQ--)
    {
        int N=read(),one=0,allone=1,ans=0;
        for(int i=1;i<=N;i++)
        {
            a[i]=read();
            if(a[i]!=1) allone=0;
            if(a[i]>1)  one=1;
            ans=ans^a[i];
        }
        if( (ans==0&&allone) || (ans!=0&&one) ) printf("John\n");
        else    printf("Brother\n");
        
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Description
  • Input
  • Output
  • Sample Input
  • Sample Output
  • HINT
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档