有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。
Input
单组测试数据。
第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5)
第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
Output
输出一个整数代表最大的mod值。
Input示例
3
3 4 5
Output示例
2
题解
类似于筛法,对于一个数x,我们要在x*i ~ x*(i+1) 这段区间中找最大值。
去重后,用二分。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<set>
#include<ctime>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
#define mod 20101009
#define ll long long
#define N 10000005
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,a[200005],mx;
int main()
{
n=read();
for (int i=0;i<n;i++) a[i]=read();
sort(a,a+n);
n=unique(a,a+n)-a;
for (int i=0;i<n;i++)
{
for (int j=a[i]<<1;j<=a[n-1];j+=a[i])
{
int p=lower_bound(a,a+n,j)-a;
if (p) mx=max(mx,a[p-1]%a[i]);
}
mx=max(mx,a[n-1]%a[i]);
}
printf("%d",mx);
return 0;
}