Description
给出n堆石子,第i堆石子有ai个。有两个人在玩游戏,每次每个人可以选择任意一堆石子,从中拿走任意个,取走最后一个石子的人输,问先手是否有必胜策略。多组数据。
n<=50,T<=500,ai<=5000
Solution
相信经典的SG游戏大家都会做。
这个东西叫做Anti-SG游戏,先手必胜有两种情况。
1:SG=0且ai全为1。
2:SG不为0且至少有一个ai>1
证明我不会,看这里
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t,x;
int main() {
for(scanf("%d",&t);t;t--) {
scanf("%d",&n);int cnt=0;bool bz=1;
for(int i=1;i<=n;i++) {
scanf("%d",&x),cnt^=x;
if (x!=1) bz=0;
}
if (cnt&&!bz||!cnt&&bz) printf("John\n");else printf("Brother\n");
}
}