博客园食用更佳
关注 洛谷 谢谢喵~
定义
公平组合游戏
公平组合游戏指(节选自 oiwiki):
* 游戏有两个人参与,两者轮流做出决策,均知道游戏的全部信息;
* 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;
* 游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。
非公平组合游戏
非公平组合游戏第二点与公平组合游戏有区别,即游戏者作出的决策几何与游戏者有关,如棋类游戏,黑方只能移动黑棋,白方只能移动白棋。
反常游戏
反常游戏则是建立传统的游戏规则上的,终结条件变为最后一个不能移动的玩家获胜。
(以上节选自 oiwiki)
NIM 游戏
这就是一类具体的博弈游戏。有 nnn 堆石子,每堆石子有 aia_iai 个,两个玩家每回合可以选择一个非空的石子堆取走至少一个石子,最先无法操作的人失败。给定游戏的初始状态,请问先手是否必胜。
本文主要以 Nim 博弈为例子来介绍 SG 函数。
博弈图
拿 Nim 博弈为例,我们选定一堆石子,假如当前堆石子为 nnn,那么根据定义,状态 nnn 可以通过取一个石子转移到 n−1n-1n−1,通过取两个石子转移到 n−2n-2n−2,以此类推。同时 n−1n-1n−1 也可以通过类似的操作进行转移。
我们将一个状态转移到另外一个状态抽象成连边的过程,那么所有的转移就被抽象成了一张图,很明显,这张图是一个 DAG(有向无环图),这是因为数字大的可以向数字小的进行转移,而数字小的不能向数字大的转移。
那我们可以得到三条定理:
* 无后继节点(在本题中 000 符合条件)的节点状态一定为必败态;
* 后继节点中只要有一个节点状态为必败态那么该点即为必胜态;
* 后继节点中若全部节点状态均为必胜态那么该点为必败态。
这三条定理证明都很简单,这里就略过了。
那么就有一个显然的做法,建立出来 max(ai)\max(a_i)max(ai ) 的博弈图,这样一定包含了所有其他的 aia_iai 的状态,然后遍历一遍得到答案,时间复杂度 max(ai)!\max(a_i)!max(ai )!。当然不能通过本题。
发现当 a1⊕a2⊕⋯⊕an=0a_1 \oplus a_2 \oplus \cdots \oplus a_n=0a1 ⊕a2 ⊕⋯⊕an =0 的时候,先手必败;否则先手必胜。
首先 a1=a2=a3=⋯=an=0a_1 = a_2 = a_3 =\cdots=a_n=0a1 =a2 =a3 =⋯=an =0 的时候符合该结论。若开局为 a1⊕a2⊕⋯⊕an=0a_1 \oplus a_2 \oplus \cdots \oplus a_n=0a1 ⊕a2 ⊕⋯⊕an =0,则先手无法通过一次使 aia_iai 减去某个数的操作再次使 ⊕ai=0\oplus a_i=0⊕ai =0,故下一步一定会使 ⊕ai≠0\oplus a_i \ne 0⊕ai =0。
若当前状态为 ⊕ai=x(x≠0)\oplus a_i =x(x \ne 0)⊕ai =x(x=0),那么设 xxx 二进制下为 111 的最高位为 ddd,则一定存在奇数个第 ddd 位为 111 的 aia_iai ,选取其中一个 aia_iai ,则一定有 ai>(ai⊕x)a_i>(a_i \oplus x)ai >(ai ⊕x),此时就可以将 aia_iai 减至 ai⊕xa_i \oplus xai ⊕x 即可。此时 ⊕ai\oplus a_i⊕ai 再次变为 000。
于是证明出来了可以通过一次操作,将 ⊕ai\oplus a_i⊕ai 从 000 变为 111,或从 111 变为 000。所以当初始状态 ⊕ai=0\oplus a_i=0⊕ai =0 是,后手一定可以一直保证操作完后 ⊕ai=0\oplus a_i=0⊕ai =0,所以先手必败;若 ⊕ai≠0\oplus a_i\ne 0⊕ai =0,则先手一定可以保证操作完之后 ⊕ai=0\oplus a_i =0⊕ai =0,故先手必胜。
而 a1⊕a2⊕⋯⊕ana_1 \oplus a_2 \oplus \cdots \oplus a_na1 ⊕a2 ⊕⋯⊕an 就被称为 Nim 和。
SG 函数
定义 mex(S)\operatorname{mex}(S)mex(S) 为集合 SSS 中第一个未出现过的非负整数,如 mex(1,2,3)=0,mex(0,1,3)=2\operatorname{mex}(1,2,3)=0,\operatorname{mex}(0,1,3)=2mex(1,2,3)=0,mex(0,1,3)=2。
有一种有向图游戏,定义为在一张 DAG 上,有一个棋子起点为 sss。游戏双方每回合可以将棋子沿有向边移动一次,最先不能移动的玩家失败。
此时我们定义节点 xxx 的 SG 函数为 SGx=mex(SGj(i→j))SG_x=\operatorname{mex}(SG_{j(i\to j)})SGx =mex(SGj(i→j) ),即其后继状态的 SG 函数的 mex\operatorname{mex}mex。
而对于一个由 nnn 个有向图游戏构成的组合游戏,设其起点分别为 s1,s2,⋯ ,sns_1,s_2,\cdots,s_ns1 ,s2 ,⋯,sn ,则有 SG 定理:当 SG(s1)⊕SG(s2)⊕⋯⊕SG(sn)=0SG(s_1) \oplus SG(s_2) \oplus \cdots \oplus SG(s_n)=0SG(s1 )⊕SG(s2 )⊕⋯⊕SG(sn )=0 时,先手必败;否则先手必胜。
证明考虑数学归纳法,这里不再详细证明。
例题 111:阶梯 NIM 游戏
有 nnn 堆石子,每堆石子有 aia_iai 个,分别在 1∼n1 \sim n1∼n 阶阶梯上。游戏双方每次可以任选一堆 xxx 阶石子,取出至少为 111 的石子放到 x−1x-1x−1 的阶梯上,当 x=1x=1x=1 时直接扔掉这些石子。最先不能操作的人失败。给定游戏的初始状态,询问先手是否必胜。
首先,对于偶数层,若先手先移动其至奇数层,那么后手可以再将其移动至偶数层。假设忽略掉偶数层后先手必胜,那么先手一定会只移动奇数层,若后手移动了偶数层,那么先手会将后手移动的那一堆石子继续向下再次移动到偶数层,所以先手依旧必胜;若先手必败,那么即使其移动了偶数层,后手同上述情况先手操作一样,最后偶数层的石子一定会被全部扔掉,所以依旧先手必败。
由此我们可以得知一个小结论,若双方操作同一物品两次后,状态不变,那么该物品就是无用的,可以忽略掉。
回到本题,此时只剩下奇数层的石子了。我们可以转化操作了,把将石子从奇数层移动到偶数层的操作变为直接扔掉该石子。因为石子一旦从奇数层移动到偶数层,那么根据刚才的小结论,这一层的石子一定无用,所以可以直接忽略。那么就转化为了正常的 Nim 游戏。只需要求出 Nim 和判断是否等于 000 即可。
例题 222:树状 NIM 游戏
有 nnn 堆石头,每堆石子有 aia_iai 个,放在一棵以 111 为根,nnn 个点的树上。游戏双方每回合任意选取节点 xxx 上的石子堆,从中取出至少为 111 的石子放在 xxx 的父亲节点上。若 x=1x=1x=1,则将石子直接扔掉。给出游戏的初始状态,询问先手是否必胜。
这题跟上题几乎完全一样,依旧只保留 depdepdep 为奇数的点,然后就可以转化为正常 Nim 游戏了,求出 Nim 和即可。
例题 333:BASH 博弈
有 nnn 堆石头,A 和 B 轮流取。每次从任意一堆取出至少一个石头,至多
mmm 个,不能取的输。问谁会获胜。
容易发现大小为 nnn 石子堆的 SG 函数为 n mod (m+1)n \bmod (m + 1)nmod(m+1),那么根据 SG 定理,只需求出 ⊕SGi\oplus SG_i⊕SGi 即可。