#Multi-SG#HDU 5795 A Simple Nim

题目

\(n\)堆石子,每次可以从一堆中取出若干个或是将一堆分成三堆非空的石子,
取完最后一颗石子获胜,问先手是否必胜


分析

它的后继还包含了分成三堆非空石子的SG函数,找规律可以发现

\[SG[x]=\begin{cases}0,x=0\\x-1,x=8k(k\in N^*)\\x+1,x=8k+7(k\in N)\\x,otherwise\end{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;
}
posted @ 2021-04-05 20:30  lemondinosaur  阅读(26)  评论(0编辑  收藏  举报