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

2018-02-24 07:51:50来源:cnblogs.com作者:自为风月马前卒人点击

分享
Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 3134  Solved: 2003
[Submit][Status][Discuss]

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

#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;}

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台