
题解:
这题是一道思维题。
我们可以把aimodajaimodaj转换成 aj∗k+aiaj∗k+ai。
那么我们可以枚举k,然后二分一下小于aj∗kaj∗k的最大的数是多少,用它mod aj的值来修正答案。
由于枚举k总共的复杂度是log的,可以类比埃式筛法。
那么总的复杂度是 O(n)log2(n)O(n)log2(n),可以水过。
代码如下:
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=200005;
int n,ans,a[maxn];
inline int read(){
int x=0; char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x;
}
int get(int x,int y){
int l=1,r=n;
while (l<=r) {
int mid=(l+r)>>1;
if (a[mid]<x) l=mid+1; else r=mid-1;
}
return a[r]%y;
}
int main(){
n=read();
for (int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)
if (a[i]!=a[i-1]) {
int j=2*a[i];
while (j-a[i]<=a[n]) {
ans=max(ans,get(j,a[i])); j+=a[i];}
}
printf("%d\n",ans);
return 0;
}

本文解决了一道思维题,通过将问题转换为数学表达式并使用枚举与二分查找优化算法复杂度,实现高效求解。详细介绍了算法思路、代码实现与复杂度分析。
366

被折叠的 条评论
为什么被折叠?



