博弈论

巴巴博弈

这里只介绍 nim 游戏。

在博弈论中,设 \(sg(x)\) 表示当前局面。那么若 \(k\) 局面先手必败,则 \(sg(k) = 0\);若 \(k\) 先手必胜,那么 \(sg(k) \ne 0\)。设终止的必败的局面(即题目中直接给的必败条件)为 \(0\),且 \(sg(0) = 0\)

跟随局面

后手可以跟着先手做策略,是一个用来分析的好技巧。

基本结论

若存在局面集合 \(s\),满足:

  1. \(0 \in s\)
  2. 对于 \(\forall a \in s\),对于 \(a\) 任意转移到的非必败场面 \(b\),都存在 \(b\) 能够转移到一个 \(c\),使得 \(c \in s\)

那么 \(s\) 中所有的情况皆为必败。

证明

对于上面的 \(a\)\(b\)\(c\),显然有 \(sg(a) = 0 \impliedby sg(c) = 0\)。若 \(sg(c) = 0\),那么存在 \(b\) 的先手必胜策略,即从 \(b\) 转移到 \(c\)。由于 \(b\)\(a\) 任意可以转移到的一个局面,所有的 \(b\) 存在一个 \(sg(c) = 0\),那么全部的 \(b\) 都是必胜的,那么 \(a\) 必败,那么我们就证明了 \(sg(a) = 0 \impliedby sg(c) = 0\)

由于 \(0 \in s\)\(\forall a \in s\) 都能找到一个 \(c\),那么存在 \(sg(a) = 0 \impliedby sg(c) = 0 \impliedby \dots \impliedby sg(0) = 0\),最后的 \(sg(0) = 0\) 显然成立。

那么就证明了 \(\forall k \in s \quad sg(k) = 0\)

sg 函数

上面设的 \(sg(x)\) 其实就是 sg 函数。\(sg(x)\) 函数表示 \(x\) 最多情况下拖多少步能够到达必败局面

所以说 sg 函数其实是可以计算的。

一堆单取 nim

一堆 \(n\) 个石子一次取任意个,没得取了输,求每个局面的 sg 函数。

这个其实是为了熟悉 sg 函数。

设局面 \(x\) 表示还剩 \(x\) 个石子的局面,\(sg(x)\) 表示还剩 \(x\) 个石子的 sg 值。那么显然有 \(sg(x) = x\)。只有对于 \(x = 0\) 是必败的,所以只有 \(sg(0) = 0\);对于 \(sg(x)_{x \ne 0}\),拖最多步的方式显然是每人只拿一个,这样的步数显然为 \(x\)

一堆多取 nim

一堆有 \(n\) 个石子,每次最多可以取 \(k\),没得取了输,问先手必胜。

显然有 \(sg(0) = 0\),并且有 \(\forall x \le k \quad sg(x) = x\)

那么后面的 \(sg(x)_{x > k}\) 怎么算呢?

答案是利用 mex 函数。

利用 mex 计算 sg 函数

\(mex(s)\) 定义为不在集合 \(s\) 内的最小自然数。

结论

对于这道题,有:

\[sg(x) = mex_{x - k \le i \le x - 1} \{sg(i)\} \]

推广一下,得到:

\[sg(x) = mex_{_{可得到的下一局面 i}} \{sg(i)\} \]

证明

首先对于必胜和必败局面即 \(sg(x)\) 是否应为 \(0\) 十分简单显然。

我们着重讲解 \(sg(x)\) 等价于局面 \(x\) 最多拖多少步能够到必败局面。

假设 \(sg(x) = k\),那么 \(1, 2, 3, \cdots, k - 1\) 都应在可得到的下一局面中的 sg 函数值中出现,那么采用数学归纳法,假设可转移到的局面的 sg 函数值都正确,反过来 \(sg(x)\) 就应为这些连续的数的最大值加 \(1\),那就是这些数的 mex,成立。对于必败局面 \(sg(x) = 0\) 显然成立,证毕。

朴素 nim 游戏

\(n\) 堆石子,第 \(i\)\(a_i\) 个,一次可选一堆中取任意个,没得取了为败,问是否先手必败。

对于单个石堆,显然有:\(sg(i) = a_i\)

那么将每个石堆的答案合起来,那么 \(n\) 个石堆应在 \(sg(x) = sg(1) \oplus sg(2) \oplus \cdots \oplus sg(n) = 0\) 的时候是必败的,可以利用基本结论证明,见推论部分证明。

推论

我们从这个题目中发现,对于多个游戏互相独立,每个游戏的局面分别假设为 \(g_1, g_2, g_3, \cdots, g_n\),那么有:

\[sg(\sum_i g_i) = sg(g_1) \oplus sg(g_2) \oplus \dots \oplus sg(g_n) \]

证明

可以用基本结论证明。

这里只需要证明所有必败情况 \(sg(x)\) 是正确的 \(0\) 即可,应为非必败都可以用 mex 函数求出。换句话说,既然必败场面是正确的,那必胜场面也一定正确。

设必败集合为 \(s = \{x | sg(x) = sg(g_1) \oplus sg(g_2) \oplus \dots \oplus sg(g_n) = 0\}\)

对于 \(0\) 的情况,我们发现所有的 \(sg(g_i)\) 都为 \(0\) 的时候是 \(0\) 情况,显然有 \(0 \in s\)

对于 \(\forall x \in s\) 转移到的情况 \(\forall t\),显然皆有 \(sg(t) \ne 0\)。那么对于 \(\forall t (sg(t) \ne 0)\), 可以从 \(sg(g_i)\) 转移至 \(sg(g'_i) = sg(g_i) \oplus sg(x)\) 使得 \(sg(x') = 0\)。这样的 \(sg(g_i)\) 是一定存在的,假设 \(sg(x)\) 最高位为第 \(k\) 位,存在 \(sg(i) \& 2^k \ne 0\),此时有 \(sg(g'_i) = sg(g_i) \oplus sg(x) < sg(g_i)\),所以此时的 \(sg(g_i)\) 可以从 \(sg(g'_i)\) 转移而来。

基本结论两个条件都证完了,式子成立。

sg 函数运算方式总结

综上,对于必败局面 \(x\)\(sg(x) = 0\)

对于非 \(0\) 局面 \(x\),有:

\[sg(x) = mex_{_{可得到的下一局面 i}} \{sg(i)\} \]

对于互不相干的几个局面 \(g_1, g_2, g_3, \cdots, g_n\) 的总局面为 \(x\),则有:

\[sg(x) = sg(\sum_i g_i) = sg(g_1) \oplus sg(g_2) \oplus \dots \oplus sg(g_n) \]

k-nim 游戏

更为特殊的 nim,同朴素 nim 但是一次能取至多 \(k\) 个至少 \(1\) 个堆中的任意个石子。

结论:将普通的朴素 nim 的亦或换成二进制序列加且每一位对 \(k + 1\) 取模。当然亦或显然就是 \(k = 1\) 时的特殊情况。但是我们注意到这样是会进位的造成不对,考虑到把他二进制拆分成向量,非法情况就是判断是不是 \(0\)

\(sg(x) = \vec{x}\),可达局面为 \(g_1, g_2, \cdots, g_m\),那么:

\[\vec{x_j} = (\sum_i \vec{g_i} _j) \mod (k + 1) \]

posted @ 2026-04-25 11:12  ACehomoxue  阅读(50)  评论(1)    收藏  举报