前置:公平组合游戏
定义:一个由两个人参与的游戏,两人轮流做出决策,游戏的所有信息都是公开的(即每个人都知道对方上一步做了什么并做出决策)。每个人在某一确定状态可以作出的决策集合仅与当前的状态有关,游戏以玩家无法行动为结束,且游戏一定会在有限步后结束,没有平局的情况。
若两人均用最优策略,在给出已知游戏条件时,游戏的胜负已知
Nim 游戏
一个公平组合游戏
有 nnn 堆石子,第 iii 堆石子有 aia_{i}ai 颗。两个人轮流取石子,每人每次可以从任意一堆中取任意颗石子扔掉,不能不取,无法操作者输,问先手必胜还是必败 / 有没有必胜策略?
解法
设 x=a1⊕a2⊕x = a_1 \oplus a_2 \oplusx=a1⊕a2⊕ … ⊕\oplus⊕ ana_nan
操作有 333 种可能性:
1.1.1. 无法操作
当前操作者输,x=0x = 0x=0
2.x=02. x = 02.x=0 且有合法操作
若更改了 ai→ai′a_i \rightarrow a_i'ai→ai′,ai≠ai′a_i \neq a_i'ai=ai′ ,则操作完后的 x=x⊕ai⊕ai′≠x = x \oplus a_i \oplus a_i' \neqx=x⊕ai⊕ai′= 操作前的 xxx
所以任意操作后 x≠0x \neq 0x=0
3.x≠03. x \neq 03.x=0
大胆猜测:存在操作使得操作后 x=0x = 0x=0
证明:设 xxx 在二进制拆分下的最高位为第 kkk 位,则必然存在至少一个 1≤i≤n1 \leq i \leq n1≤i≤n 使得 aia_iai & (1<<(k−1))(1 << (k - 1))(1<<(k−1)) 且 ai⊕x<aia_i \oplus x < a_iai⊕x<ai
所以可以从第 iii 堆中拿走 ai−(ai⊕x)a_i - (a_i \oplus x)ai−(ai⊕x) 颗石子,即 ai→ai′=ai⊕xa_i \rightarrow a_i' = a_i \oplus xai→ai′=ai⊕x ,使得 x=x⊕(ai⊕ai′)=x⊕x=0x = x \oplus (a_i \oplus a_i') = x \oplus x = 0x=x⊕(ai⊕ai′)=x⊕x=0
结论
当任意一人面对 x=0x = 0x=0 的情况时要么无法操作要么对方存在方案使 tatata 一直面对 x=0x = 0x=0 的情况直至无法操作
若在初始情况下 x=0x = 0x=0 ,先手必输,否则先手必胜
拓展:阶梯 Nim
有 nnn 堆石子在 nnn 级阶梯上,第 iii 级上的石子有 aia_{i}ai 颗。两个人轮流取石子,每人每次可以从任意一堆中将任意颗石子移到下一级上(从最后一级移下后石子消失),不能不移,无法操作者输,问先手必胜还是必败 / 有没有必胜策略?
解法(阶梯 Nim)
若这不是第一次移动,则上一步对手的操作有两种情况:
1.1.1. 移动偶数层上的石子
此时可以把对方移动的石子再往下移动到偶数层 / 消失,奇数层石子数量不变
不难发现,如果只能移动偶数层的石子,后手必胜(即先手在初始时或后手某次操作后无法进行操作,偶数层的石子数目是多少对答案的影响不变,均为 000 )
故偶数层的石子数量并不影响答案
2.2.2. 移动奇数层上的石子
既然偶数层对于答案没有影响,那么从奇数层往下移石子就相当于 Nim 游戏中的扔掉石子
用序列 aaa 中下标(从 111 开始)为奇数的 aia_iai 生成序列 bbb ,直接使用 Nim 游戏模板判断序列 bbb 的异或和是否为 000 即可