题意:有一盒糖,里面有M中颜色的糖果,每种有Mi个,Jone和他Brother两个人轮流拿糖,每次可以拿任意颗一种颜色糖,不能不拿,谁拿到最后一颗谁输。
解题思路:利用SG函数,与NIM,求出SG的值!此题与杭电2509题类似,主要注意
条件不同,所产生的SG就不同,并且要注意当它的每堆数量为1时,要分析清楚!!!
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,t,n,x,flag,s;
scanf("%d",&t);
while(t--)
{
s=0;flag=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(x>1)//所以有必要标记下,有些糖个数为1 时,情况会不同。、sg也会不同
flag=1;//若等于一个,那就是第一个人赢了,
s^=x;
}
if(s&&flag||!s&&!flag)//此处注意条件!
printf("John\n");
else
printf("Brother\n");
}
return 0;
}