我们不妨升级 Nim 游戏,每次不但可以取走,还可以放入,但不能不操作,为了游戏的有限,每次放入后如果满足某个条件,之后双方将无法放入,而且每次放入对放入的数量有限制。
对于异或和 \not=0,显然可以看作只能减少,然后显然可以把异或和变为 0。
对于 =0,显然还是要改变,因此还是会重新变为 \not=0 给对方。
因此这个游戏与上述普通 Nim 游戏必胜策略一致,与放入的条件之类无关,但当减少有限制时,游戏结果或受到影响。
sg 函数及定理
对于公平组合游戏,我们设置的状态可以是 dp_S 表示局面初始为 S 时,先手是否必胜。因为公平组合游戏我们并不关心当前到底是该谁操作。此时我们转移就只有简单的寻找能到达的状态中是否有 0,若有,则 dp_S=1,否则 dp_S=0。当然,此时还是复杂度很高。我们可以模拟 Nim 游戏进行考虑,这样我们或许能借用异或的性质来增速。设 sg(S) 表示状态 S 等价于 Nim 游戏中一个有 sg(S) 个石子的石堆。如果 S 状态指向 P 集合中每一个状态,我们有 sg(s)=\text{mex}_{T\in P} sg(T)。由上面的升级 NIM 容易得出。如果不借助性质,此时 sg(S)\not=0 对应原来的 dp_S=1,sg(S)=0 对应原来的 dp_S=0。容易看出确实等价。不过 sg(S) 有一个很大的性质,可以让我们优化转移。那就是如果当前状态 S 可以分成若干互不影响的子游戏,每次选取一个子游戏进行操作,比如 Nim 取石子可以分成 n 个子游戏,每个子游戏都是一堆石子,显然取走这堆石子不会影响其他石子堆。我们设这些子游戏组成集合 G。我们有 sg(S)=\oplus_{T\in G}sg(T)。
证明的话就是数学归纳法。对状态 S 操作一次到的状态相当于对于 T\in G,对恰好一个 T 进行一次操作。
根据上文,一个状态 A 操作之后成为状态 B,只有 sg(B)<sg(A) 才有意义,所以我们只保留这一种。
如果对 S 操作一次之后,这个性质成立,根据数学归纳法,最终无法操作状态显然也只能分成若干无法操作的子游戏,便可以得证。
于是我们要证明的东西等价于如下问题:
一个序列 a 的异或和为 x,请问对于任意 0\le y<x,是否存在 t,p,使得 p<a_t,并且将 a_t 修改为 p 之后序列异或和为 y。
我们分析一下,相当于 x\oplus a_t\oplus p=y。
推导可得 (x\oplus y)\oplus a_t=p。
因为 y<x。
因此存在某一位二进制,使得更高位二者相等,x 这一位是 1,y 是 0,异或和后就是这一位最高,因为原序列的异或和 x 这一位是 1,因此必然能找到一个这一位是 1 的数 a_t,异或和之后得到的 p 这一位必定是 0,更高位和 a_t 相等,因此 p<a_t,因此得证!
当 x,y>\frac n 2 时,显然 sg(x)=sg(y)=0,且 \lfloor\frac n x\rfloor=\lfloor\frac n y\rfloor 成立。
对于 tx,ty,如果 \lfloor\frac n x\rfloor=\lfloor\frac n y\rfloor 成立,则 \lfloor\frac n {tx}\rfloor=\lfloor\frac {\lfloor\frac{n}{x}\rfloor} {t}\rfloor=\lfloor\frac {\lfloor\frac{n}{y}\rfloor} {t}\rfloor=\lfloor\frac n {ty}\rfloor,由于前者已经在题设中成立,因此结论成立,因此当 tx>x,\lfloor\frac n {tx}\rfloor=\lfloor\frac n {ty}\rfloor 时,sg(tx)=sg(ty) 成立,sg(x)=sg(y) 可以推导成前式题设,对于 t>1 都成立,x 成立,由于当 tx>\frac{n}{2} 时成立,因此对于 x 成立。使用的嗜血数学归纳法,没看懂可以自行推导。