题意: 反nim博弈,取到最后一颗石子的人输。
思路:来自贾志豪的IOI 2009 论文,有空大家可以看一下感触很深,直接出结论:
对于一个SJ游戏,先手必胜当且仅当:(1) 游戏的的SG函数不为0,且游戏中的某个单一游戏的SG函数大于1
(2)游戏的SG值为0,且没有单一游戏的SG值大于1 ‘
套上板子就过了
上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 1000+10;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int flag = 0 ,te;
int n;
scanf("%d",&n);
int ans = 0 ;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&te);
if(te > 1)
{
flag++;
}
ans = ans ^ te;
}
if((ans == 0 && flag == 0) || ans !=0 && flag)
{
puts("John");
}
else
{
puts("Brother");
}
}
}