一组数 从中取两个数大的对小的取余 问最大的余数是多少
初始化1~max的数组 数组里存序列中小于该数组当前下标的最大的数
找的时候枚举序列中的数的2、3、4...倍 对应的数组中以2、3、4*x为下标的数对x取余后得到的最大的数就是以x为模序列中的数取余后的MAX
每个数这么遍历一遍即可
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define sz 1000000
using namespace std;
int a[200001];
int ls[sz*2+1];
bool vis[sz*2+1];
int tp;
int main()
{
int n,i,mm,j,mz,k;
scanf("%d",&n);
tp = 0;
memset(vis,0,sizeof(vis));
for(i = 0; i < n; ++i)
{
scanf("%d",&a[tp]);
if(!vis[a[tp]])
{
vis[a[tp]] = 1;
tp++;
}
}
sort(a,a+tp);
mz = a[tp-1]*2;
mm = 0;
for(i = mz, j = tp-1; i >= a[0] && i != 1; --i)
{
if(vis[i])
{
for(k = 2; k*i <= mz; ++k)
{
mm = max(mm,ls[k*i]%i);
}
--j;
}
ls[i] = a[j];
}
printf("%d\n",mm);
return 0;
}