[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");
}
}