AcWing 891:Nim游戏 ← SG函数 + Nim博弈
【题目来源】
【题目描述】
给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
【输入格式】
第一行包含整数 n。
第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量。
【输出格式】
如果先手方必胜,则输出 Yes。
否则,输出 No。
【输入样例】
2
2 3
【输出样例】
Yes
【数据范围】
1≤n≤10^5,
1≤每堆石子数≤10^9
【算法分析】
● Nim 博弈定理:对于任意的 {a1, a2, a3, …, an},若 S=a1⊕a2⊕a3⊕⋯⊕an 的值不等于 0,先手必胜,记为 N-position(先手必胜态)。若 S=a1⊕a2⊕a3⊕⋯⊕an 的值等于 0,先手必败,记为 P-position(先手必败态)。
● 标准 Nim 堆的 SG 函数值
对于标准 Nim 的单堆石子,状态 x 表示堆内有 x 枚石子。
取走任意非零(1~x)枚石子,可得状态 x 的后继集合为 {0, 1, …, x-1}。
故,sg(x)=mex{sg(0), sg(1), …, sg(x-1)}。
故数学归纳可得,标准 Nim 堆的 SG 函数为:sg(x)=x。
【算法代码一:SG函数写法】
【算法代码二:非SG函数写法】
【参考文献】

浙公网安备 33010602011771号