[BZOJ]1022
题意:
有一堆什么东西,A先手取,B后手,每次可以取走一整堆或者是一部分(至少取走一个),谁拿了最后一个谁赢,给出每堆的数量,求A必胜还是B必胜。
题解:
反Nim游戏故作高深,实际上并不知道啥叫Nim游戏,反正这个东西就是反Nim。
对于这个东西来说,如果所有的堆数量都为1的话,SG函数值为0的话A赢,否则B赢。
如果所有的堆数量不一定都为1,SG函数值不为0的话A赢,否则B赢。
SG函数值就是把所有的堆异或起来,至于为什么这样是对的,请**出门百度自行查看**233
代码:
这个代码还真是蜜汁好写啊
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int Maxn = 52;
int T,n,a[Maxn];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i = 1;i <= n;i++)scanf("%d",&a[i]);
int SG = 0,pd = 0;
for(int i = 1;i <= n;i++){
if(a[i] != 1)pd = 1;
SG ^= a[i];
}printf("%s\n",((pd == 0 && SG == 0) || (pd == 1 && SG != 0)) ? "John" : "Brother");
}return 0;
}