题解:
这题是一道思维题。
我们可以把
aimodaj
a
i
mod
a
j
转换成
aj∗k+ai
a
j
∗
k
+
a
i
。
那么我们可以枚举k,然后二分一下小于
aj∗k
a
j
∗
k
的最大的数是多少,用它mod aj的值来修正答案。
由于枚举k总共的复杂度是log的,可以类比埃式筛法。
那么总的复杂度是
O(n)log2(n)
O
(
n
)
l
o
g
2
(
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;
}