[Luogu 12763] 【POI 2018】Book of poetry

被结论题创飞 0 分,模拟赛 5 人猜结论通过,结论可能符合某些人直觉,但是证明不容易,【蓝题】。

记模数为 \(m\)。令 \(a_i \gets (a_i + 1) \bmod m\)

记一个指针表示当前位置 \(p\),初始 \(p = 0\)。每填入一个数 \(x\),令 \(p = (p + x) \bmod m\)。若不是最后一个数且 \(p = m - 1\),令 \(p = 0\),计数器 \(+ 1\)

\(x = 0\)\(p\) 不影响,不妨先全部填完这部分,只需要考虑 \(1 \le x \le m - 1\) 的部分的填法。

定理:每次找到出现次数最多的 \(x\),若填 \(x\) 不会使 \(p = m - 1\),或只剩下 \(x\) 一种数,则填 \(x\),否则填出现次数次多的。这种填法一定最优。

证明

显然每次填数至多只有一种数会导致 \(p = m - 1\)

假设初始存在 \(k\) 个众数。

\(k \ge 2\)

一定能不花费额外代价填完。

设当前众数的出现次数为 \(c\)。所有出现次数为 \(c\) 的数构成集合 \(S\)

\(S\) 中每次任选一个能填的填入,填完从 \(S\) 删去,一定能顺利填 \(k - 1\) 次,剩一个 \(x\)

\(x\) 能直接填,直接得到 \(c' = c - 1\) 的子问题。

\(c = 1\),最后一次填数,直接填。

若出现次数 \(= c - 1\) 的有 \(> 1\) 个数,随便填一个后可以填 \(x\),得到一个 \(c' = c - 1\) 的子问题。

否则恰有一个出现次数为 \(c - 1\),这个数一定是上次填入的数 \(y\),且这轮开始前 \(k = 2\)

考虑填 \(y\) 之前的 \(p\)

  • 因为 \(1 \le x, y \le m - 1\)\(x \neq y\)\(p \neq m - 1\)\(p + x + y \equiv m - 1 \pmod m\)
  • 所以 \(\forall v \in \{p + y, p + 2y, p + 2y + x, p + 2y + 2x\}\)\(v \not\equiv m - 1 \pmod m\)

因此,再填一次 \(y\),然后填两次 \(x\),得到一个 \(c' = c - 2\) 的子问题。

不断缩小问题规模,最终使得 \(c = 0\),归纳可证。

\(k = 1\)

可能变成 \(k \ge 2\),或不能变成 \(k \ge 2\) 但是不花费代价,或需要花费代价。

设这个出现次数特别多的众数为 \(x\)

若能在用完其他数之前,不花费代价把 \(x\) 用完,那么一定能找到第一个时刻,满足 \(x\) 的出现次数与其他数的众数的出现次数相同,此时进入 \(k \ge 2\) 的问题。

\(\gcd(x, m) \neq 1\),那么怎么填 \(x\) 都不会到达 \(m - 1\),会变成 \(k \ge 2\) 的问题。

\(u = x^{-1} \bmod m\),对模 \(m\) 意义下所有数 \(\times u\)(让填 \(x\) 变成 \(+1\)),初始位置 \(p = (u + 1) \bmod m\)。当移动到 \(p = 1\) 且未填完 \(x\) 时,会被强制花费 \(1\) 代价移动到 \((u + 1) \bmod m\)

\(y \neq x\),填 \(y\) 会导致 \(p = (p + yu) \bmod m\),记这样为长度为 \(d = yu \bmod m\) 的一次“跳”。

不妨先假设 \(x\) 的数量充分大,使得填完 \(x\) 必须花费代价。

容易发现没有越过 \(1\) 的“跳”不优。改为越过 \(1\) 之后,空出 \(u\) 个可以放置 \(x\) 的位置,并节省 \(1\) 的代价。

从后往前逐一调整,把每一次“跳”设为从 \(0\) 开始,即在不“跳”有代价时才“跳”,使得除了最开始一组之外,每一组 \(0 \sim m - 1\) 独立。因为顺序无关,将不消耗代价的放前面,每次直接选次大就对。

若在“跳”用完之前先用完 \(x\),则在此之前已经变成 \(k \ge 2\) 的问题。

posted @ 2025-11-21 16:08  SZwinsun  阅读(11)  评论(0)    收藏  举报