有个想法就是先排序,对每个 ai 分别找 [ai,2ai−1],[2ai,3ai−1],[3ai,4ai−1]…
中的最大值
复杂度对吗?
其实这个就是调和级数:
∑i=1n1i
可以证明这个是 O(ln n) 的
所以总复杂度是 O(n⋅ln n)
示例程序:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200005;
int n,a[maxn],ans=0;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
for (int i=1;i<=n;i++){
for (int l=a[i],r=2*l-1;l<=a[n];l=r+1,r+=a[i])
ans=max(ans,*(lower_bound(a+i,a+n+1,r+1)-1)%a[i]);
}
printf("%d",ans);
return 0;
}