ATCoder ARC299D - Nim_k ?
问题陈述
有 \(K+1\) 堆石头。第 \(i\) 堆有 \(A_i\) 块石头。
爱丽丝和鲍勃在玩一个游戏。在这个游戏中,他们轮流移动,爱丽丝先移动。在每一轮中,下面的操作都会进行 \(K\) 次。
- 选择一堆有一个或多个石子的棋子,并从中取出一个或多个石子。在此,同一回合内可以多次选择同一堆棋子。
在自己的回合中无法执行 \(K\) 次操作的玩家输掉游戏。当双方都以最佳方式下棋时,哪一方获胜?
给你 \(T\) 个测试案例,请逐个解决。
这啥博弈?
将满足以下条件的状态定义为" \(P\) 状态":
关于 \(P\) 状态,以下三个命题成立。
如果在一个回合 \(\to\) 中不能进行 \(K\) 次操作,则是 \(P\) 状态
当无法进行 \(K\) 次操作时,棋子总数小于 \(K\) 。由于小于棋子堆的数量,所以存在一个零棋子的棋子堆。因此, \(m=0\) 和 \(\sum\limits_i (A_i - m) < K\) 成立,满足状态 \(P\) 的条件。
从 \(P\) 状态移动到 \(P\) 状态是不可能的
假设可以从 \(P\) 状态移动到另一个状态。
作为 \(P\) 状态的一个属性,假设当前 \(P\) 状态的最小值为 \(tk\) ,从条件 \(\sum\limits_i (A_i-tk) \lt K\) 中,我们可以得到:
如果可以在一个回合内从 \(P\) 状态移动到另一个状态,那么至少有一堆棋子的数量不会发生变化,因此最小值 \(tk\) 需要保持不变。然而,由于 \(\sum\limits_i (A_i-tk) \lt K\) 在移动之前保持不变,这样的操作不可能进行 \(K\) 次,这是一个矛盾。
从一个不是 \(P\) 的状态出发,总是有可能移动到 \(P\) 的状态。
设当前的最小值为 \(m = qK + r, 0 \leq r \lt K\) ,并让 \(j\) 表示其中一个达到最小值的堆积点。
我们的分歧在于 \(r = 0\) 是否可以移动。
如果是 \(r \gt 0\) ,则只需将 \(j\) 以外的棋子数减少到 \(qK\) 即可。如果是 \(r = 0\) ,则只需保持棋子堆 \(j\) 不变,将其他棋子堆减至 \(m\) 即可。(由于原始状态不是 \(P\) 状态,我们有 \(\sum\limits_i (A_i - m) \geq K\) ,因此可以通过适当的操作来实现)。
因此,无论哪种情况,都可以移动到 \(P\) 状态。
综上所述,我们已经证明
- 如果一个回合无法完成 \(\to\) 它就是一个 \(P\) 状态
- 不可能从 \(P\) 状态移动到另一个状态
- 从非 \(P\) 状态总是可以移动到 \(P\) 状态
由此可见, \(P\) 状态正是棋手移动的失败状态。简单地说,如果一个棋手的轮回状态不是 \(P\) 状态,那么他的制胜策略就是移动到 \(P\) 状态。初始状态是否为 \(P\) 状态可以在 \(\mathrm{O}(K)\) 中计算。

浙公网安备 33010602011771号