这还是 SG 吗?

· · 算法·理论

本文经 ChatGPT 的略微学术润色。
如果有问题记得在评论区踹我一脚。

背景

事情是这样的,这是百度之星 2026 第一场初赛的第六题:
场上的我:这应该……是道简单题吧。
于是对着它疯狂思考约 1h,然后弃掉了。
第二题代码能力问题没写出来,然后就倒闭了。
后面回来思考这题,然后 10min 就会了。
大失败。
后面发现这其实和无穷序数有着很大的关联,那就借这道题瞎说点东西吧。
因为这里介绍的 SG 超出了正常的 SG 范围,所以如果不会标准 SG 出门左转。

题解

SG 值分析

定义 \operatorname{SG}(a,b,c) 为当题目中的一个游戏机状态为 (a,b,c) 时,这个状态的 SG 值。
定义 \operatorname{MEX}(A) 为集合 A 的 \operatorname{MEX},其定义为“最小的不属于 A 的非负整数”。

接下来考虑 $\operatorname{SG}(a,b,1)$。 先从 $b=0$ 入手。当 $a=0$ 时,此时你只能进行第二种操作,那么可以转移到 $(x,x,0)(x\ge b)$,对应 SG 值为 $x$(注意,这里的 $x$ 没有上界)。 因为我们固定了 $b=0$,那么子状态的集合为 $\{0,1,2,\cdots\}$,如果这时候的 SG 值仍为非负整数,那么永远可以从这个集合里找到一个 SG 值等于它的子状态,和 SG 值的定义不符。 这说明 SG 值已经无法限制在非负整数中,同时子状态集合的 $\operatorname{MEX}$ 就根本不存在了。 那咋办?我们发明一个新的记号 $\omega$,把它排在所有非负整数的后面,具体地,大小关系为 $$0<1<2<\cdots<\omega$$ 那 $\operatorname{SG}(0,0,1)$ 就很明显为 $\omega$ 了。 接下来我们再考虑 $a=1$。 同理得进行第二种操作所得到的子状态集合为 $\{0,1,2,\cdots\}$,但因为我们还可以进行第一种操作到达 $(0,0,1)$,所以子状态集合还要再添加一个 $\omega$。 此时 $\omega$ 也用不了了,那咋办? 那我们就继续构造,再 $\omega$ 的后面再排上一个 $\omega+1$,此时 SG 值就成了 $\omega+1$。 那么我们再在 $\omega+1$ 之后排上一个 $\omega+2$,就可以得到 $\operatorname{SG}(2,0,1)=\omega+2$。 以此类推得到 $\operatorname{SG}(a,0,1)=\omega+a$。 自然地,$\operatorname{MEX}$ 的定义也需要随之扩展。我们仍然把 $\operatorname{MEX}(A)$ 理解为“不属于 $A$ 的最小值”,只不过它的取值范围不再局限于非负整数,而是也包含我们刚刚构造出的这些新对象。例如,$\operatorname{MEX}(\varnothing)=0$,而 $\operatorname{MEX}(\{0,1,2,\cdots\})=\omega$。 --- 接下来我们考虑 $b>0$。 当 $a=0$ 时,$\operatorname{SG}(0,b,1)=\operatorname{MEX}(\{ b,b+1,\cdots\})=0$。 我们假定 $a<b$,那么 $a=1$ 时,$\operatorname{SG}(1,b,1)=\operatorname{MEX}(\{0, b,b+1,\cdots\})=1$,同理 $\operatorname{SG}(2,b,1)=\operatorname{MEX}(\{0,1,b,b+1,\cdots\})=2$,$\operatorname{SG}(a,b,1)=\operatorname{MEX}(\{0,1,\cdots,a-1,b,b+1,\cdots\})=a$。 这个规律会在 $a=b$ 的时候被打破,此时两个子状态的连续段就连成了一段,$\operatorname{SG}(b,b,1)=\operatorname{MEX}(\{0,1,\cdots,b-1,b,b+1,\cdots\})=\omega$。 那么容易得到 $\operatorname{SG}(b+1,b,1)=\operatorname{MEX}(\{0,1,\cdots,b-1,b,b+1,\cdots\} \cup \{\omega\})=\omega+1$。 以此类推,得 $\operatorname{SG}(b+x,b,1)=\operatorname{MEX}(\{0,1,\cdots,b-1,b,b+1,\cdots\}\cup \{\omega,\omega+1,\cdots,\omega+x-1\})=\omega+x$。 综合上述的所有情况(包括 $b=0$),可得 $\operatorname{SG}(a,b,1)=\begin{cases}a&a<b\\\omega+a-b&a\ge b\end{cases}$。 --- 接下来考虑 $c=2$,先从 $a=0$ 入手。 此时你可以通过第二种或第三种操作转移到所有 $(x,x,1)(x\ge b)$ 和 $(x,x,0)$,但 $(x,x,1)$ 的 SG 值都是 $\omega$,故子状态的 SG 值集合为 $\{0,1,2,\cdots\} \cup \{\omega\}$,取 $\operatorname{MEX}$ 后得到 SG 值为 $\omega+1$。同时也可以得到此时的 SG 值与 $b$ 无关。 $a=1$ 时除了上述状态也可以转移到 $(0,b,2)$,SG 值为 $\omega+1$,故此状态的 SG 值为 $\omega+2$。 以此类推得到 $\operatorname{SG}(a,b,2)=\omega+a+1$。 --- 接着考虑 $c=3$,同样从 $a=0$ 入手。 此时你可以通过第三种操作到达所有的 $(x,x,0)$ 和 $(x,x,1)$,所以 SG 值至少为 $\omega+1$。 而第二种操作可以到达所有 $(x,x,2)(x\ge b)$,对应值为 $\omega+x+1$。 所以当 $a=0<b$ 时,其子状态集合为 $\{0,1,2,\cdots\} \cup \{\omega,\omega+b+1,\omega+b+2,\cdots\}$,其 $\operatorname{MEX}$ 为 $\omega+1$。 可以发现这和 $c=1$ 的情况高度相似。 类似 $c=1$ 可得当 $a<b$ 时,$\operatorname{SG}(a,b,3)=\omega+a+1$。 我们重点讨论 $a=b$ 的情况。 此时子状态集合为 $\{0,1,2,\cdots\} \cup \{\omega,\omega+1,\omega+2,\cdots\}$,此时的 SG 值已无法用任何 $\omega+x$ 形式的数表示。 那咋办?考虑仿照 $c=1$ 的做法,把这个 $x$ 替换成 $\omega$,那么此时的 SG 值就可以用 $\omega+\omega=\omega\cdot 2$ 表示了。 现在我们构造出的记号大小顺序为: $$0<1<2<\cdots<\omega<\omega+1<\omega+2<\cdots<\omega\cdot 2$$ 所以 $\operatorname{SG}(b,b,3)=\omega\cdot 2$。 那么以此类推: $\operatorname{SG}(b+1,b,3)=\operatorname{MEX}(\{0,1,2,\cdots\} \cup \{\omega,\omega+1,\omega+2,\cdots\} \cup \{\omega\cdot 2\})=\omega\cdot 2+1$。 $\operatorname{SG}(b+2,b,3)=\operatorname{MEX}(\{0,1,2,\cdots\} \cup \{\omega,\omega+1,\omega+2,\cdots\} \cup \{\omega\cdot 2,\omega\cdot 2+1\})=\omega\cdot 2+2$。 于是 $\operatorname{SG}(a,b,3)=\begin{cases}\omega+a+1&a<b\\\omega\cdot 2+a-b&a\ge b\end{cases}$。 --- $c=4,5$ 和 $c=2,3$ 基本相同,易得 $\operatorname{SG}(a,b,4)=\omega\cdot 2+a+1$, $\operatorname{SG}(a,b,5)=\begin{cases}\omega\cdot 2+a+1&a<b\\\omega\cdot 3+a-b&a\ge b\end{cases}$ 读者自证不难。 讲到这里,相信大家已经看出了规律: - 当 $c=0$ 时,$\operatorname{SG}(a,b,0)=a$。 - 当 $c=1$ 时,$\operatorname{SG}(a,b,1)=\begin{cases}a&a<b\\\omega+a-b&a\ge b\end{cases}$。 - 当 $c=2m(m>0)$ 时,$\operatorname{SG}(a,b,c)=\omega\cdot m+a+1$。 - 当 $c=2m+1(m>0)$ 时,$\operatorname{SG}(a,b,c)=\begin{cases}\omega\cdot m+a+1&a<b\\\omega\cdot (m+1)+a-b&a\ge b\end{cases}$。 上述结论可以按照 $c$ 归纳证明,证明过程与上面 $c=2,3$ 的分析完全一致,这里略去重复部分。 将每个游戏机的 SG 值异或起来就做完了。 可是 $\omega$ 怎么异或? ### 胜负判定 注意到普通 Nim 中,胜负判定是由数值的异或和决定的。 于是考虑构造一个新的异或 ${}^1$:定义 $(\omega\cdot a+b)\oplus(\omega\cdot c +d)=\omega\cdot (a\oplus c)+(b\oplus d)$。 我们猜测,先手必败当且仅当所有 SG 值的异或和恰好为 $0$。事实证明的确如此,以下为详细证明。 ::::info[证明]{open} 假设第 $i$ 个游戏机的 SG 值为 $\omega\cdot p_i+q_i$,$\operatorname{MEX}$ 的性质告诉我们,它可以转移到所有 SG 值更小的子状态 $\omega\cdot p^{\prime}_i+q^{\prime}_i$,其中 $p^{\prime}_i<p_i$ 或 $p^{\prime}_i=p_i,q^{\prime}_i<q_i$。 设 $p_i$ 的异或和为 $P$,$q_i$ 的异或和为 $Q$,则当 $P=Q=0$ 时为必败状态。 先证必败状态的所有子状态必为必胜状态。采用反证法,假设存在一个 $x$ 和对应的 $p^{\prime}_x$ 和 $q^{\prime}_x$ 满足操作后其为必败态,则由异或的性质得: - $P=P\oplus p_x\oplus p^{\prime}_x=0$。 - $Q=Q\oplus q_x\oplus q^{\prime}_x=0$。 于是 $p_x\oplus p^{\prime}_x=q_x\oplus q^{\prime}_x=0$,$p_x=p^{\prime}_x$ 且 $q_x=q^{\prime}_x$,根据 $\operatorname{MEX}$ 的定义,不存在任意一个子状态的 SG 值与当前状态相同,矛盾。 故必败状态的所有子状态必为必胜状态。 再证必胜状态存在至少一个子状态为必败状态。 先给出一个普通 Nim 游戏的引理: > 一个非负整数序列 $a_1,a_2,\cdots,a_n$,满足 $\bigoplus\limits_{i=1}^{n}a_i\neq 0$,则一定存在一个 $x$ 和对应的 $0 \le a^{\prime}_x<a_x$,满足 $\bigoplus\limits_{i=1}^{n}a_i\oplus a^{\prime}_x\oplus a_x=0$。 > 证明可以上网去搜,这里略过。 然后分类讨论: - $P\neq 0$。根据引理以及 $\operatorname{MEX}$ 的性质,一定存在一个 $x$ 和对应的 $0\le p^{\prime}_x<p_x$ 满足 $P\oplus p^{\prime}_x\oplus p_x=0$,同时无论选择哪个 $q^{\prime}_x$,根据 $\omega$ 的性质都有 $\omega\cdot p^{\prime}_x+q^{\prime}_x<\omega\cdot p_x+q_x$,$\operatorname{MEX}$ 的性质告诉我们该操作一定合法,所以将 $p_x$ 修改成对应的 $p^{\prime}_x$ 并将 $q^{\prime}_x$ 置为 $Q\oplus q_x$ 即可。 - $P=0$,此时 $Q\neq 0$。我们保持 $p$ 不变,根据引理,一定存在一个 $x$ 和对应的 $0\le q^{\prime}_x<q_x$ 满足 $Q\oplus q^{\prime}_x\oplus q_x=0$。根据证明开头提到的 $\operatorname{MEX}$ 的性质,这个操作一定是合法的,将这个 $q_x$ 修改成 $q^{\prime}_x$ 即可。 综上所述,先手必败当且仅当所有 SG 值的异或和恰好为 $0$,证毕。 :::: 综上,我们在 $O(n)$ 的时间复杂度内解决了此题,那这篇文章就可以收工了……吗? --- 先别急,我们刚才为了让 $\operatorname{MEX}$ 继续工作,一路构造出了 $$ 0,1,2,\cdots,\omega,\omega+1,\omega+2,\cdots,\omega\cdot 2,\cdots $$ 看起来多少有点野生数学的味道。 不过这些东西当然不是为了这道题临时编出来的。事实上,它们早就有一个统一的名字——**序数(Ordinal Number)**。 而我们刚才做的事情,本质上就是把普通 SG 函数的值域从非负整数推广到了序数。 ## 无穷序数的介绍 ### 从 $\omega$ 开始 记 $a\rightarrow b$ 表示将 $a$ 标号为 $b$。 下面为了方便理解,我们只考虑已经按照某种顺序排好的集合,并用“编号”来描述其中各元素所处的位置。 我们最常使用的自然数,其实就是最简单的序数。 但需要注意的是:直观上,可以把序数理解成描述“排列位置”的对象;更准确地说,它描述的是顺序类型,而不是单纯的元素数量。 例如,一个集合 $\{a,b,c\}(a< b< c)$,如果我将这个集合从 $0$ 开始编号,$a\rightarrow 0$,$b\rightarrow 1$,$c\rightarrow 2$,假设我往后面再放一个数 $x$(称之为“虚拟元素”${}^2$),那么显然 $x\rightarrow 3$,这个集合对应的序数就是 $3$。 考虑集合 $\{0,1,2,\cdots\}$,如果我往后面再放一个“虚拟元素”,那么这个新位置已经排在所有有限编号之后,我们把这个新编号记作 $\omega$。自然地,这个集合的序数就是 $\omega$ 了。 如果我往刚刚提到的这个集合里再放一个元素 $x$,那么 $x$ 的编号就是 $\omega$,自然地,“虚拟元素”的编号就是 $\omega+1$。 同理,如果我又放了一个 $y\rightarrow \omega+1$,那么“虚拟元素”的编号就是 $\omega+2$。 如果我们在原来的 $\omega$ 段后面,再接上一整段同样具有序型 $\omega$ 的集合,那么整个集合会变成 $\{0,1,2,\cdots,x,y,z,\cdots\}$,此时“虚拟元素”的编号会超越一切 $\omega+a$,那就自然地可以想到将这个元素的编号设为 $\omega+\omega=\omega\cdot2$,那么这个集合的序数就是 $\omega\cdot2$ 了。 以此类推,我们会有 $\omega\cdot3,\omega\cdot4,\omega\cdot5$ 等等,这恰好对应了题解部分里出现的 SG 值。 尽管序数是表示编号的,但是序数其实也有加法,并且这种加法不满足交换律。 依旧以集合入手,我们可以将序数的加法理解成:把两个集合首尾相接,并规定前一个集合中的所有元素都排在后一个集合之前。 例如 $3+2$ 就可以理解成:在一个原本对应序数为 $3$ 集合 $\{a,b,c\}$ 后接上对应序数为 $2$ 的集合 $\{d,e\}$,使其序数变为 $3+2=5$。 当两个序数都是有限序数时,序数加法与普通整数加法一致,因此满足交换律。 可当加法中出现 $\omega$,事情就变得不一样了。 先考虑 $\omega+1$,这相当于在 $\{0,1,\cdots\}$(序数为 $\omega$)中再添加一个 $x$,易知 $x\rightarrow \omega$,此时因为 $\omega$ 已经被占用了,所以你只能将“虚拟元素”编号为 $\omega+1$。 再考虑 $1+\omega$,这相当于在序数为 $1$ 的集合 $\{x\}$(序数为 $1$)的后面接上集合 $\{0,1,\cdots\}$。 我只需要将每个元素重编号,具体地,$x\rightarrow0,0\rightarrow1,1\rightarrow2,\cdots$,那么这些编号都会是非负整数而不是 $\omega$,所以“虚拟元素”的编号就是 $\omega$。 到这里就可以发现,$1+\omega=\omega<\omega+1$,同理得到 $2\cdot \omega=\omega<\omega\cdot2$。 理由是 $2\cdot\omega$ 可以通过 将第 $n$ 组(从 $0$ 开始编号)序数为 $2$ 的块 $\{x,y\}$ 编号为 $2n$ 和 $2n+1$,此时每个元素都有非负整数的编号,故序数为 $\omega$。 但 $\omega\cdot2$ 表示先完整放上一个 $\omega$ 块,再接上一个 $\omega$ 块,前一个块的序数已经是 $\omega$ 了,所以第二个块只能从 $\omega$ 开始编号,自然会比 $\omega$ 要大。 ### 一些更大的序数 既然有 $\omega+\omega$,那我们也可以有 $\omega\cdot\omega=\omega^2$,可以理解为把 $\omega$ 个顺序类型为 $\omega$ 的块依次首尾相接,此时所有形如 $\omega\cdot a+b\quad (a,b\in \mathbb{Z}_{\ge0})$ 的编号都已出现,即 $\omega^2$ 排在它们之后。 类似的,我们也有 $\omega^2+1,\omega^2+2, \cdots ,\omega^2+\omega,\cdots,\omega^2\cdot 2,\cdots,\omega^2\cdot\omega=\omega^3$。 能不能再给力一点? 考虑扩大指数,这样我们就有 $$\omega^4,\omega^5,\cdots,\omega^\omega$$ 继续扩大指数: $$\omega^{\omega+1},\cdots,\omega^{\omega\cdot2}\cdots,\omega^{\omega^2}\cdots,\omega^{\omega^{\omega}}$$ 如果我们一直这样向上叠 $\omega$,我们会得到 $\omega^{\omega^{\omega^{\omega}}},\omega^{\omega^{\omega^{\omega^\omega}}}$,这些有限高度的幂塔会不断变大,我们把它们的上确界记作 $\varepsilon_0$。 这个突然冒出来的 $\varepsilon_0$ 是啥?它恰好是最小满足 $\omega^\alpha=\alpha$ 的序数 $\alpha$。你可以把它理解成“$\omega$ 的 $\omega$ 层幂塔”。 --- 如果继续往后,还可以定义 $\varepsilon_1,\varepsilon_2,\cdots$,甚至更大的序数,但这些已经远远超出了这篇文章讨论的范围。 虽然说这道题真正用到的甚至只有 $\omega\cdot a+b$ 这一小段,但它已经足够把普通 SG 从有限整数带进无穷序数了。 至于更大的序数,就留到以后真的遇到需要它们的题时再说吧。 ## 注释 ${}^1$:这个运算并不是临时构造出来的,它恰好对应序数的 Nim 和(Nim-Sum),在本题只出现 $\omega\cdot a+b$ 的情况下,就是分别对系数 $a,b$ 做异或。 ${}^2$:仅为辅助理解,它的编号表示的是前面整个集合的顺序类型。