CF484B
题面
一个数组,求数组中大数模小数的最大值。
题解
你好。重复的元素没有用,而且由于只需要满足
第一个暴力就是直接从小到大排序并去重,然后枚举
然后发现这里的
排序去重后,枚举
然后发现不管怎么剪枝复杂度还是过不了,那考虑再次优化算法。
把枚举
还记得
最后只需要求
令
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+15;
int n;
int a[N],s[N*10],m;
int ans;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),m=max(a[i],m);
sort(a+1,a+1+n);
n=unique(a+1,a+1+n)-a-1;
for(int i=1;i<=n;i++) s[a[i]]=a[i];
for(int i=1;i<=2*m;i++) if(!s[i]) s[i]=s[i-1];
for(int i=1;i<n;i++) {
for(int j=2*a[i];j<=m+a[i];j+=a[i]) {
if(s[j-1]>j-a[i]) ans=max(ans,s[j-1]%a[i]);
}
}
printf("%d",ans);
return 0;
}