[bzoj1022][SHOI2008]小约翰的游戏John【博弈论】

【题目链接】
  http://www.lydsy.com/JudgeOnline/problem.php?id=1022
【题解】
  Anti-Nim游戏
  这里写图片描述
  *SG值即为异或值
  证明:
  (2)似乎不用证明
  (1)的话,如果SG==0,那么一定有一堆以上大于1,所以先手无法做到(2)的第2点,若先手行动后还剩下一堆大于1的,那么后手可以做到进入第二个状态(取完那堆或剩一个),如果大于1堆,那么只要模仿先手使得SG变为0即可。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int num,opt,n,j,flag;
    for (scanf("%d",&opt); opt>0; opt--){
        scanf("%d",&n); num=flag=0;
        for (int i=1; i<=n; i++){
            scanf("%d",&j);
            num=num xor j;
            if (j>1) flag=1;
        }
        if ((flag==1&&num==0)||(flag==0&&num!=0)) printf("Brother\n");
            else printf("John\n");
    }
}
posted @ 2018-02-25 21:04  Vanisher  阅读(88)  评论(0编辑  收藏  举报