本题与Nim游戏相反,无法移动的人获胜。
分类讨论:
·记 SG = a1^ a2^ …^ an
(1)每一堆石子的数量都是1:
·若石子的堆数为偶数,先手必胜
·若石子的堆数为奇数,先手必败
(2)至少存在一堆石子的数量大于1:
该情况下,一定存在某一步操作使得当前局面从上述情况(2)变为上述情况(1),即一步将最后一堆大于1的石子变为0或1的操作。记操作前的局面为A,操作后的局面为B。A->B过程中,操作可以选择将这堆石子变为0或1。
根据Nim游戏的定义,本题中,可以令SG≠0代表先手必胜(考虑将A->B时最后一堆石子的变化改为令自己在本题中的条件下失败,则恰好符合Nim游戏定义,故相反可行)。
必胜局面SG≠0,胜者可以通过移动使传递给败者的局面SG=0。而败者局面SG=0,必定会将SG≠0的局面传递给胜者。不断循环,可知SG≠0时必胜。
·若SG≠0,先手必胜
·若SG=0,先手必败
#include<cstdio>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n, x, SG=0;
bool allone=1;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&x);
SG^=x;
if(x!=1)allone=0;
}
if(!allone && SG!=0 || allone && !SG)puts("John");
else puts("Brother");
}
}