https://vjudge.net/problem/POJ-3480
经典的Nim博弈的一点变形。设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,
设状态
S0:a1a2…an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败)。
S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜->就是构造S0)。
T0:a1异或到an=0 &&充裕堆=0,先手必胜(只有偶数个孤独堆,先手必胜)。
S2:a1a2…an!=0&&充裕堆>=2。
T2:a1a2…an=0&&充裕堆>=2。
这样的话我们用S0,S1,S2,T0,T2将所有状态全部表示出来了,并且S0先手必败,S1、T0先手必胜,那么我们只需要对S2和T2的状态进行分析就行了。
(a)S2可以取一次变为T2。
(b)T2取一次可变为S2或者S1。因为S1是先手必胜态,那么根据a,b这两个转换规则,我们就能得知S2也是先手必胜,T2是先手必败。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t,n,x;
cin>>t;
while(t--)
{
cin>>n;
int r=0,f=0;
for(int i=0;i<n;i++)
{
cin>>x;
if(x>1) f=1;
r^=x;
}
if((!r && f) || (r && !f))
cout<<"Brother\n";
else
cout<<"John\n";
}
return 0;
}