题目
有(n)堆石子,每次可以从一堆中取出若干个或是将一堆分成三堆非空的石子,
取完最后一颗石子获胜,问先手是否必胜
分析
它的后继还包含了分成三堆非空石子的SG函数,找规律可以发现
[SG[x]=egin{cases}0,x=0\x-1,x=8k(kin N^*)\x+1,x=8k+7(kin N)\x,otherwiseend{cases}
]
判断(n)堆石子SG函数异或和不为0则先手必胜
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
for (rr int T=iut();T;--T){
rr int ans=0;
for (rr int n=iut();n;--n){
rr int x=iut();
switch (x&7){
case 0:{
ans^=x-1;
break;
}
case 7:{
ans^=x+1;
break;
}
default:{
ans^=x;
break;
}
}
}
if (ans) puts("First player wins.");
else puts("Second player wins.");
}
return 0;
}