联考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)\)。