0. 前置芝士
定义状态
( ext{P}):表示当前局面下先手必败。
( ext{N}):表示当前局面下先手必胜。
( ext{N,P}) 状态的转移满足如下性质:
-
合法操作集合为空的局面为 ( ext{P})。
-
可以移动到 ( ext{P}) 的局面为 ( ext{N})。
-
所有移动只能到达 ( ext{N}) 的局面为 ( ext{P})。
1. 楔子
1.1. 问题
一共有 (n) 堆石子,第 (i) 堆中有 (a_i) 个石子。
每一次操作小 (mathtt{G}) 和小 (mathtt{D}) 可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子。
两个人轮流行动,取走最后一个的人胜利。小 (mathtt{G}) 为先手。
1.2. 结论
1.2.1. 内容
对于局面 ((a_1,a_2,...,a_n)),它是 ( ext{P}) 局面当且仅当 (a_1 ext{xor} a_2 ext{xor}... ext{xor} a_n=0)。
1.2.2. 证明
容易发现只要满足以下三个条件即可:
- 这个判断将最终态判为 ( ext{P}) 局面。显然最终态全零。
- 根据这个判断被判为 ( ext{N}) 局面的局面一定可以移动到某个 ( ext{P}) 局面。设异或和为 (k),则一定存在 (a_i),其二进制表示在 (k) 的最高位上是 (1)。由于二进制较高位上的 (1) 表示的十进制一定大于位数较低位上的 (1) 表示的十进制之和,则 (a_i ext{xor} k< a_i)(异或 (k) 也不会影响 (a_i) 的更高位)。那么我们将 (a_i) 改成 (a_i ext{xor} k),异或和就变成 (0) 了。
- 根据这个判断被判为 ( ext{P}) 局面的局面无法移动到某个 ( ext{P}) 局面。异或和为 (0) 只能异或 (0) 即取 (0) 个石子,故无法移动到某个 ( ext{P}) 局面。
2. ( ext{Sprague-Grundy}) 函数
2.1. 定义
将 ( ext{ICG}) 的每个局面看成一个节点,对每个局面和它的子局面连一条有向边。这就转变成了在有向无环图上的移动游戏。
定义节点 (u) 的 ( ext{sg}) 函数为
3. ( ext{Sprague-Grundy}) 定理
3.1. 内容
总游戏的 ( m sg) 函数值为它所包含的独立子游戏 ( m sg) 函数值的异或和。
3.2. 证明
实际上,这和上文取石子问题是一样的 —— 总游戏就是所有石子,独立子游戏就是一堆石子。
同上文判断方法,我们判断三个条件:
- 这个判断将最终态判为 ( ext{P}) 局面。显然最终态即叶子节点为零。
- 根据这个判断被判为 ( ext{N}) 局面的局面一定可以移动到某个 ( ext{P}) 局面。首先可以发现,当 ( ext{sg}(u)=k) 时,( ext{sg}(v)) 必包含区间 ([0,k)) 的每个数,这是不是和取石子游戏很相似?用上文证明方法即可。
- 根据这个判断被判为 ( ext{P}) 局面的局面无法移动到某个 ( ext{P}) 局面。
4. 例题
上课五分钟。
“好了我把新课讲完了,接下来我们开始做题。”
4.1. (sf Interval Game 2)
设总游戏状态为 ([1,100)),代表所有区间都没有被选择。
接下来的问题在于是否能将总游戏状态划分成独立子游戏。显然如果我们每次选取区间 ([l_i,r_i))(即有向边),总游戏状态可以被划分成 ([1,l_i)cup [r_i,100))(即子局面)。
所以有: