CF484B题解

题面

Description:
给定 \(N\) 个数 \(a_{1\sim N}\),求 \(a_i \bmod a_j\) 的最大值。

\(1\leq N\leq2\times10^5,1\leq a_i\leq10^6\)


考虑取模运算的本质。
\(a\bmod b=m\),则 \(a-b\times k=m\),其中 \(k=a/b\)
那么我们枚举 \(b\)\(k\),则因为 \(k=a/b\),所以 \(a\in[b\times k,b\times(k+1)-1]\)。为了使 \(a\bmod b\) 最大,那 \(a\) 应该在给定范围内尽可能大。于是想到了二分 \(a\)

这个时间复杂度是 \(O(N\log N\ln M)\) 的。倒序枚举 \(b\) 并且在当前 \(ans>b\) 时停止循环是一种有效的优化方式。当然,原数组必须要去重。

Code

posted @ 2022-07-04 20:06  1358id  阅读(27)  评论(0编辑  收藏  举报