联考2021B 取模

并不难但挺有意思的题。

题目

如果你选的模数确定了,那么可以轻松 \(O(n)\) 求出答案。

猜测模数只能是本质不同的最大的 \(K\) 个之一,其中 \(K\) 很小。

假设 \(a_1\le a_2\le \cdots \le a_n\),取到最优解时选的模数为 \(a_p\)\(a_p=a_n\)\(K\)\(O(1)\) 的,只要讨论 \(a_p<a_n\) 时的情况),则答案小于 \(a_p\)
设比 \(a_n\) 小的最大 \(a_i\)\(a_{n'}\)

  • 如果 \(a_{n'}=a_p\) 那显然 \(K\)\(O(1)\) 的。
  • 如果 \(a_{n'}\ne a_p\),则 \(a_{n'}\le a_p+(a_n-a_{n'})<2a_{n'}\),这是因为
    - 若左边的小于等于号不满足,则 \((a_p+a_n)\mod a_{n'}=a_p+(a_n-a_{n'})>a_p\),矛盾;
    - 若右边的小于号不满足,则 \(a_p+(a_n-a_{n'})\ge 2a_{n'}\Rightarrow a_n\ge 3a_{n'}-a_p>2a_{n'}>2a_p\Rightarrow a_p+a_{n'}<a_n\Rightarrow (a_p+a_{n'})\mod a_n=a_p+a_{n'}>a_p\),矛盾。
    所以 \((a_p+a_n) \mod a_{n'}=((a_n-a_{n'})+a_p)-a_{n'}=(a_n-a_{n'})-(a_{n'}-a_p)\ge 0\),所以 \(a_{n'}-a_p\le \frac12 (a_n-a_p)\)
    然后比如说,设比 \(a_{n'}\) 小的最大 \(a_i\)\(a_{n''}\),同理 \(a_{n''}-a_p\le \frac12 (a_{n'}-a_p)\),那么显然这样迭代个 \(O(\log a_n)\) 次就没掉了。

因此 \(K\)\(O(\log a_n)\) 的。

要注意如果有相同的,要取本质不同的最大的 \(K\) 个。\(K\) 取个 \(50\) 就保证正确性了。

时间复杂度 \(O(n\log n\log a_n)\)

posted on 2022-03-13 02:20  Dreamunk  阅读(121)  评论(0编辑  收藏  举报

导航