题意: 还是nim博弈不过赢得方式变成了,谁最后一个取谁输。
思路:来自贾志豪 2009年的国家队论文,里面提出的SJ,这里直接说结论了,想看证明的可以下载贾志豪的 国家队论文,百度一搜就有的,
对于一个SJ游戏先手赢得条件是:单一游戏的sg全部小于等于1,且总的游戏的sg等于0 或者 单一游戏的sg值至少一个大于1,且总的游戏sg值不等于0
上代码把:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000+100;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int te,ans = 0,flag = 0;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&te);
ans = ans ^ te;
if(te > 1){ //nim游戏的 单一游戏的sg值就是它本身。
flag = 1;
}
}
if(flag && ans || !flag && !ans) //单一游戏的sg值至少一个大于1 且 总的sg值不等于0 或者 单一游戏的sg值小于1且总的sg值等于0先手胜利
{
puts("John");
}
else
{
puts("Brother");
}
}
return 0;
}