题意
有几堆糖果,两个人轮流取,可在某一堆中取任意个,或者选择一堆分成三堆,取走最后一个糖果的人输了。
思路
对于某一堆来说所有状况的后继的糖果数量都小于当前的糖果数量(如果分堆则是三个小的SG的异或值),所以可以地推打一个小范围的SG表,发现当i%8 == 7 时sg[i] = i+1,同时,sg[i+1] = i;
直接根据这个结论就可以算出所有糖果数量的SG值,直接异或即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main (){
int T;
scanf("%d", &T);
while(T --){
int n;
scanf("%d",&n);
int ans = 0;
while(n --){
int tmp;
scanf("%d", &tmp);
if(tmp%8 == 7)
tmp ++;
else if(tmp%8 == 0)
tmp --;
ans ^= tmp;
}
if(ans == 0) puts("Second player wins.");
else puts("First player wins.");
}
return 0;
}