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\) 时停止循环是一种有效的优化方式。当然,原数组必须要去重。