枚举mod,二分答案
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000100;
int a[MAXN],sum[MAXN],mx;
bool judge(int x,int limit)
{
for(int i=a[x];i<=mx;i+=a[x])
{
if((sum[(i+a[x]-1>mx?mx+1:i+a[x]-1)]-sum[(i+limit-1>mx?mx+1:i+limit-1)])>0)
return 1;
}
return 0;
}
int main()
{
int n,i,ans,lef,rig,mid;
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(sum));
mx=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[a[i]]++;
mx=max(mx,a[i]);
}
for(i=1;i<=mx+1;i++)
sum[i]+=sum[i-1];
ans=0;
for(i=1;i<=n;i++)
{
if(ans>=a[i]-1)
continue;
lef=ans+1;rig=a[i]-1;
while(lef<=rig)
{
mid=(lef+rig)>>1;
if(judge(i,mid))
lef=mid+1;
else
rig=mid-1;
}
ans=max(ans,rig);
}
printf("%d\n",ans);
}
}