有\(n\)堆石子,每次可以从一堆中取出若干个或是将一堆分成两堆非空的石子,
取完最后一颗石子获胜,问先手是否必胜
它的后继还包含了分成两堆非空石子的SG函数,找规律可以发现
判断\(n\)堆石子SG函数异或和不为0则先手必胜
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef unsigned uit;
inline uit iut(){
rr uit 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 uit T=iut();T;--T){
rr uit ans=0;
for (rr uit n=iut();n;--n){
rr uit x=iut();
switch (x&3){
case 0:{
ans^=x-1;
break;
}
case 3:{
ans^=x+1;
break;
}
default:{
ans^=x;
break;
}
}
}
if (ans) puts("Alice");
else puts("Bob");
}
return 0;
}
#Multi-SG#HDU 3032 Nim or not Nim?
原文:https://www.cnblogs.com/Spare-No-Effort/p/14619321.html