爆了哦。
SG 函数
用在公平组合游戏里。
大概是说:每个状态都有一个 \(\text{SG}\) 函数,其值等于所有后记状态的 \(\text{SG}\) 函数的 \(\text{mex}\)。同时,若当前状态的 \(\text{SG}\) 值为正数,则当前状态为必胜态;否则(当前状态的 \(\text{SG}\) 值为 \(0\)),当前状态为必败态。
证明一下,当前状态的 \(\text{SG}\) 值为正数时,其必可以转移到一个 \(\text{SG}\) 值为 \(0\) 的状态,否则必定会转移到 \(\text{SG}\) 值为正的状态。
经典的取石子游戏(取完最后一个的人胜)就是把 \(\text{SG}(0)\) 设为 \(0\) 算。然后改成取完最后一个的人败的话,好像只需要把 \(\text{SG}(0)\) 设为 \(1\) 就行了。
\(\text{SG}\) 定理:若一个博弈可分为多个独立子博弈,则整个博弈的 \(\text{SG}\) 值等于所有子博弈的 \(\text{SG}\) 值的异或和。
证明如下:
首先,若在任何情况下,我们都可以通过一步操作使得 \(\text{SG}\) 从非 \(0\) 变成 \(0\),则定理必定成立。接下来考虑如何证明这个事情。
设当前状态的 \(\text{SG}\) 值为 \(p\) 且其二进制最高位为第 \(k\) 位,则首先,当前状态必定至少存在一个子博弈,满足其二进制的第 \(k\) 位为 \(1\),这个显然。接下来,由前文定义得,对于任意小于该子状态的 \(\text{SG}\) 值的 \(\text{SG}\) 值,该子状态都可以一步转移到 \(\text{SG}\) 值为该值的状态。
于是,考虑将该状态大于 \(k\) 的位保持不变,第 \(k\) 位由 \(0\) 变 \(1\),\(1\) 到 \(k - 1\) 位变为值为 \(p - 2^{k - 1}\) ,取这样的一个 \(\text{SG}\) 值,并将这个状态转移过去,总状态的 \(\text{SG}\) 值将变为 \(0\)。容易发现这样的转移必定正确。
来点题。
-
ABC297G - Constrained Nim 2
考虑子问题的 \(\text{SG}\) 函数。首先设有一个数量为 \(x\) 的石子堆,则:
- \(x < l\) 时,\(\text{SG}\) 值显然为 \(0\)。
- \(l \le x < 2l\) 时,一步操作必然会转移到 \(x < l\) 的情况,故 \(\text{SG}\) 值为 \(1\)。
- \(2l \le x < 3l\) 时,一步操作会转移到上面的两种状态中,故 \(\text{SG}\) 值为 \(2\)。
以此类推,我们可以发现,当 \(x < l + r\) 的时候,\(\text{SG}\) 值就是 \(\lfloor \frac{x}{l} \rfloor\)。接下来考虑 \(x \ge l + r\) 的情况。
- \(l + r \le x < 2l + r\) 时,显然先手必败,故 \(\text{SG}\) 值为 \(0\)。
- \(2l + r \le x < 3l + r\) 时,转移到 \(x < l + r\) 的话先手仍然必败,故先手必定会转移到 \(l + r \le x < 2l + r\) 的情况,\(\text{SG}\) 值为 \(1\)。
进一步地,设当前的状态 \(x\) 位于区间 \([p \times (l + r), (p + 1) \times (l + r))\) 时,感性理解可以发现,先手必定不会进行一步跃出这个区间的转移。理性分析就是跃出这个区间的话,因为它不会减去超过 \(r\) 的值,所以跃出这个区间后,\(\text{SG}\) 值必定比只考虑这个区间内的情况的 \(\text{SG}\) 值要大。
故对于数 \(x\),其 \(\text{SG}\) 值为 \(\lfloor \frac{x \% (l + r)}{l} \rfloor\)。最终答案只需用 \(\text{SG}\) 定理求一下并判断即可。
考场上要学会打表观察 \(\text{SG}\) 函数的值,别再推你的策略了。