【学习笔记】SG 函数与 SG 定理
公平组合游戏
公平组合游戏满足以下条件:
-
两个玩家参与游戏,轮流操作。
-
游戏以某个玩家不能操作未结束,且不能操作的玩家失败,游戏不含平局。
-
游戏的操作与玩家无关,只与当前的状态有关。
-
游戏状态不会重复出现,若将状态设为点,将一次操作对状态的改变设为有向边,将得到有向无环图。
博弈图
根据公平组合游戏的最后一个条件,定义没有出边的状态必败状态,有连向必败状态出边的状态为必胜状态,没有连向必败状态出边的状态为必败状态。
可以通过搜索在 \(O(n+m)\) 的复杂度判断每个状态是否必胜或必败。
Nim 游戏
\(n\) 堆石子,第 \(i\) 堆有 \(a_i\) 个,轮流操作,每次操作可以任选一堆石子拿走若干,不能不拿,最终不能操作玩家的失败。
结论:当且仅当 \(\bigoplus_{i=1}^n a_i=0\) 时先手必败,否则先手必胜。
根据上面对状态必胜必败的定义,可以证明:
-
最终不能操作时 \(a_i=0\),有 \(\bigoplus_{i=1}^n a_i=0\),必败。
-
若 \(\bigoplus_{i=1}^n a_i=k\neq 0\),设 \(k\) 的二进制最高位 \(2^d\),那么一定存在一个 \(a_i\) 满足 \(a_i\) 在 \(2^d\) 上为 \(1\),此时一定有 \(a_i>a_i\oplus k\),令 \(a_i\leftarrow a_i\oplus k\),就可以到达一个异或和为 \(0\) 的必败状态,必胜。
-
若 \(\bigoplus_{i=1}^n a_i=0\),不难发现修改任意一个 \(a_i\) 一定会改变异或和,因此该状态只能到达异或和不为 \(0\) 的状态,必败。
SG 函数
定义一个状态 \(x\) 的 SG 函数 \(\mathrm{SG}(x)\),计算方式为:
其中 \(y_i\) 是 \(x\) 连向的状态,\(\mathrm{mex}\) 定义为集合中未出现的最小自然数。
若 \(\mathrm{SG}(x)=0\),则 \(x\) 状态是必败状态,否则是必胜状态。
证明依旧类似:
-
终止状态的 \(\mathrm{SG}(x)=0\),必败。
-
若 \(\mathrm{SG}(x)\neq 0\),说明存在 \(\mathrm{SG}(y_i)=0\),即可以到达一个必败状态,必胜。
-
若 \(\mathrm{SG}(x)=0\),说明不存在 \(\mathrm{SG}(y_i)=0\),即无法到达一个必败状态,必败。
我们发现 \(\mathrm{mex}\) 函数的引入并不突兀,它只是十分契合判断必败必胜的方法。
SG 定理
定义一个局面 \(x\) 由若干互不影响的子游戏状态 \(x_i\) 组成,那么 \(\mathrm{SG}(x)=\bigoplus_{i=1}^n \mathrm{SG}(x_i)\)。
证明仍然类似:
-
终止状态所有 \(\mathrm{SG}(x_i)\) 均为 \(0\),必败。
-
其他情况我们只关心操作对 \(\mathrm{SG}(x_i)\) 的改变,由 \(\mathrm{mex}\) 定义知 \(x_i\) 可以移动到的状态 \(y\) 中,\(\mathrm{SG}(y)\) 取遍 \([0,\mathrm{SG}(x_i)-1]\)。也可能存在 \(\mathrm{SG}(y)>\mathrm{SG}(x_i)\),但由于 \(y\) 可以移动到的状态 \(z\) 中,一定存在 \(\mathrm{SG}(z)=\mathrm{SG}(x_i)\),相当于没有操作,因此只会向更小的部分移动。这就等价于 Nim 游戏取石子了,直接套用 Nim 游戏的证明。
参考资料
- OI Wiki