SG
Nim 游戏
公平组合游戏的一般思考方式,是将所有的状态放到 DAG 上,用状态之间的有向边模拟一方的操作。
如最经典的 Nim 游戏。有
在这个问题中,当前所有石堆的石子数量构成的长度为
显然初始源点为
显然有以下三个性质:
- 没有后继状态的状态是必败态;
- 后继状态中存在必败状态的状态是必胜状态;
- 后继状态中都是必胜状态的状态是必败状态。
因此可以做一个 DAG 上的 DP。从出度为
在 Nim 游戏中,容易发现状态数是
我们断言,
下面令
证明时,考虑将其带入三条性质中:
-
没有后继状态,即
a_1=a_2=\dots=a_n=0 的状态。显然其异或和为0 且必败。满足第一条性质。 -
考虑构造性证明。我们希望找到一堆石子 $a_i$,让它变成 $a_i \oplus s$。这样新的异或和就是 $0$ 了。 可以这样操作的充要条件是 $a_i \oplus s < a_i$,即操作后这堆石子的数量必须减少。此时需要证明一定存在 $i$ 使得 $a_i \oplus s < a_i$。 因为 $s \ne 0$,所以 $s$ 一定有最高二进制位。令 $\operatorname{highbit}(s) = k$。那么一定存在至少一个 $a_i$ 满足 $2^k \in a_i$。更准确的,存在奇数个 $a_i$ 满足 $2^k \in a_i$。 注意到 $a_i \oplus s$ 是除 $i$ 外其它数的异或和。如果 $a_i$ 是某个满足 $2^k \in a_i$ 的数,那么其他数中一定有偶数个满足存在 $2^k$-位。即 $a_i \oplus s$ 的第 $k$ 位一定为 $0$。 而 $s$ 的 $>k$ 的位一定为 $0$。$s$ 与 $a_i$ 异或后,$>k$ 的位都会与 $a_i$ 相同。 也就是说,$a_i \oplus s$ 与 $a_i$ 在 $>k$ 的位都相同,且 $a_i \oplus s$ 的第 $k$ 位是 $0$,$a_i$ 的第 $k$ 位为 $1$。所以 $a_i \oplus s < a_i -
反证法。当前 $s=0$,一步操作后仍然 $s=0$。设我们操作第 $i$ 堆石子,并将 $a_i \to a_i \oplus k$,那么需要保证 $a_i \oplus k < a_i$。 而已知 $s=0$ 而且 $s \oplus k = 0$(即操作前后异或和都为 $0$),所以 $k=0$。那么这一步操作中并没有取石子,矛盾。
由此引出 SG 定理。
SG 定理
仍然考虑有向图上的博弈。上一节我们给了每个点一个 bool 属性表示是否先手必胜。现在我们将这个属性扩展至非负整数集,即
设
显然
如果当前游戏是若干个游戏的和,即有多个有向图,每个有向图都有恰好一个起点。最初这些起点上各有一枚棋子,双方轮流操作,选择一个棋子沿着某条出边移动一步。所有棋子都无法移动时后手败。
SG 定理:在这个组合游戏中,先手必胜的充要条件是
考虑证明。
因为
由定义易得,
事实上,这个点的后继也可能存在
因此问题变成了,从