题目: LINK
给定n个数 a., 求ai % aj的最大值, ai > aj .
遍历所有的aj,求ai % aj 最大,即在[aj, 2*aj-1] [2*aj, 3*aj-1] .... [k*aj, M] 每个区间取最大值,找到其中的取模最大的即可。
复杂度大约为O(M + M/2 + M/3 + ... + 1) 即约为O(M*log(M)) M为数值最大值.
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define INF 1000000000
//typedef __int64 LL;
#define N 2000005
int n, num[N];
int main() {
int ma = 0;
scanf("%d", &n);
int tmp;
for(int i = 1; i <= n; i ++) {
scanf("%d", &tmp);
num[tmp] = tmp; ma = max(ma, tmp);
}
for(int i = 1;i <= ma * 2; i++) {
if(!num[i]) num[i] = num[i-1];
}
int ans = 0;
for(int i = 1;i <= ma; i++) {
if(num[i] != i) continue;
for(int j = i*2-1; j <= ma + i; j += i) {
ans = max(ans, num[j] % i);
}
}
cout<<ans<<endl;
return 0;
}