首页 > 其他 > 详细

#Multi-SG#HDU 5795 A Simple Nim

时间:2021-04-05 21:29:26      阅读:12      评论:0      收藏:0      [点我收藏+]

题目

\(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;
}

#Multi-SG#HDU 5795 A Simple Nim

原文:https://www.cnblogs.com/Spare-No-Effort/p/14619368.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!