【小记】SG函数

记号说明:\([2^k]x\) 表示数 \(x\) 在二进制下第 \(k\) 位(采用这个记号是来自于形式幂级数中记号 \([x^k]f(x)\) 的启发)。

规定游戏如下:给定初始局面,两个人轮流操作,每次使当前局面走到某一个后继局面(局面后继关系图给定,且是 DAG),若没有后继局面则失败(将没有后继局面的局面称为直接必败局面)。

为游戏的每个局面定义一个 \(\operatorname{sg}\) 值,使得对于任意局面 \(u\),设其 \(\operatorname{sg}\) 值为 \(x\),满足:

  • \(u\) 一定能走到任意 \(\operatorname{sg}\) 值小于 \(x\) 的后继局面。
  • \(u\) 一定不能走到 \(\operatorname{sg}\) 值为 \(x\) 的后继局面。
  • \(u\) 可能可以走到某些 \(\operatorname{sg}\) 值大于 \(x\) 的后继局面。

且满足:直接必败局面的 \(\operatorname{sg}\) 值为 \(0\)

考虑从直接必败局面开始,反向递推每种局面的 \(\operatorname{sg}\) 值。

发现每个局面的 \(\operatorname{sg}\) 值一定恰好为其所有后继局面 \(\operatorname{sg}\) 值的 \(\operatorname{mex}\)

称一个游戏是由 \(n\) 个子游戏构成的,当且仅当:对于该游戏的任意局面,可以将其看成是 \(n\) 个子游戏各自的局面组成的 \(n\) 元组,且其所有可能的后继局面恰为 “将 \(n\) 个子游戏中的某一个的局面替换为其后继局面” 所形成的所有可能的后继局面。

对于一个由 \(n\) 个子游戏构成的游戏,其每个局面的 \(\operatorname{sg}\) 值为所有子游戏对应的局面的 \(\operatorname{sg}\) 值的异或和。

证明:只需证明其满足 \(\operatorname{sg}\) 值所需满足的条件即可(因为 \(\operatorname{sg}\) 值的唯一性已经说明过了)。

若令游戏的每个局面的 \(\operatorname{sg}\) 值为其所有子游戏对应的局面的 \(\operatorname{sg}\) 值的异或和:

对于游戏的任意一个局面 \(u\),设其 \(\operatorname{sg}\) 值为 \(x\),设每个子游戏对应局面的 \(\operatorname{sg}\) 值分别为 \(x_1,\cdots,x_n\),那么 \(x_1\oplus\cdots\oplus x_n=x\)

  • 对于任意 \(y<x\)\(u\) 一定能走到 \(\operatorname{sg}\) 值为 \(y\) 的后继局面:只需证明存在一个 \(i\) 使得 \(x_i\oplus(x\oplus y)<x_i\) 即可。

    由于 \(y<x\),所以找到最高位 \(k\) 使得 \([2^k]x\neq [2^k]y\),那么 \([2^k]x=1\)\([2^k]y=0\)。可以发现 \((x\oplus y)\) 的最高位也应是第 \(k\) 位。

    又由于 \([2^k]x=1\),所以一定存在 \(i\) 使得 \([2^k]x_i=1\),那么此时一定有 \(x_i\oplus(x\oplus y)<x_i\)

  • \(u\) 一定不能走到 \(\operatorname{sg}\) 值为 \(x\) 的后继局面:这要求存在某个子游戏 \(i\) 的局面有 \(\operatorname{sg}\) 值等于 \(x_i\) 的后继局面。

  • \(u\) 可能可以走到某些 \(\operatorname{sg}\) 值大于 \(x\) 的后继局面:这甚至不能称得上是条件,它显然成立。

而对于任意直接必败局面,容易发现其 \(\operatorname{sg}\) 值为 \(0\)

证毕。

从而,对于一个游戏,若它是由 \(n\) 个子游戏构成的,我们可以直接令其每个局面的 \(\operatorname{sg}\) 值为所有子游戏对应的局面的 \(\operatorname{sg}\) 值的异或和。

我们现在来证明,一个局面是先手必胜的,当且仅当它的 \(\operatorname{sg}\) 值大于 \(0\)

好吧这个证明十分简单,我们略去(

从而,我们基本完成了 sg 函数的基础框架的构建。更深入的等遇到了再补吧。

posted @ 2022-10-31 08:15  ez_lcw  阅读(124)  评论(0编辑  收藏  举报