题目描述:
N堆石子 两个人轮流取,取最后一个石子的人输
题目分析:
反 Nim 游戏
题解来自于 DorikoTY 巨巨
先上结论:一个状态为必胜态,当且仅当所有堆的石子个数为1,且Nim和为0 或 至少有一堆的石子个数大于1,且Nim和不为0。
证明如下:显然所有堆石子个数都为1且石子对数为偶数时先手必胜,而只有一堆石子个数不为1时,Nim和不为0,可以将该堆拿完或拿到只剩一个石子的状态从而使对手处于必败状态。其余情况下,Nim和为0时只能转移至Nim和不为0且至少有一堆石子个数大于1的情况,从而无法取得游戏的胜利。
题目链接:
Ac 代码:
#include <cstdio>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int flag=0,SG=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x>1) flag=1;
SG^=x;
}
if(!flag) puts(n%2?"Brother":"John");
else puts(SG?"John":"Brother");
}
return 0;
}