题目描述
一个有n个元素的集合,求集合内较大元素除较小元素的最大余数
思路
元素很小
所以我们把暴力求出第一个小于
i
(
1
−
1
e
6
)
i(1-1e6)
i(1−1e6)的元素
然后再暴力枚举每个元素的倍数得出答案
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, Ans, A[5000250], F[5000250];
int main()
{
scanf("%d", &n);
Ans = 0;
for(int i = 1; i <= n; ++i)scanf("%d", &A[i]);
sort(A + 1, A + n + 1);
n = unique(A + 1, A + n + 1) - A - 1;
for(int i = 1; i <= n; ++i)
for(int j = A[i] + 1; j <= A[i + 1]; ++j)
F[j] = A[i];
for(int i = 1; i <= n; ++i)
{
for(int j = A[i] * 2; j <= A[n]; j += A[i])
Ans = max(Ans, F[j] % A[i]);
Ans = max(Ans, A[n] % A[i]);
}
printf("%d", Ans);
return 0;
}