#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <set>
using namespace std;
#define N 1000020
#define LL long long
int n;
LL a[N], b[N];
LL ans;
LL san[N];
int cnt, c[N], d[N];
set<LL> s;
LL gcd(LL a, LL b) {
while(a && b && (a >= b? a %= b: b %= a));
return a + b;
}
int haxi(LL x) {
return lower_bound(san + 1, san + cnt + 1, x) - san;
}
void calc(int x) {
cnt = 0;
for(int i = 1; i <= n; ++i) {
b[i] = gcd(a[i], a[x]);
}
for(int i = 1; 1LL * i * i <= a[x]; ++i) {
if(a[x] % i) continue;
san[++cnt] = i;
if(1LL * i * i != a[x]) san[++cnt] = a[x] / i;
}
sort(san + 1, san + cnt + 1);
cnt = unique(san + 1, san + cnt + 1) - san - 1;
for(int i = 1; i <= cnt; ++i) c[i] = d[i] = 0;
for(int i = 1; i <= n; ++i) c[haxi(b[i])]++;
for(int i = 1; i <= cnt; ++i) {
if(san[i] <= ans) continue;
for(int j = i; j <= cnt; ++j) {
if(san[j] % san[i] == 0) d[i] += c[j];
}
}
for(int i = 1; i <= cnt; ++i) {
if(d[i] * 2 >= n) ans = max(ans, san[i]);
}
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%I64d", &a[i]);
ans = 1;
srand(233);
for(int x = 1, cnt = 0; x <= 12 && cnt <= 1000020; ++x, ++cnt) {
int v = 1LL * rand() * rand() % n + 1;
if(s.count(a[v])) {
--x;
continue;
}
s.insert(a[v]);
calc(v);
}
printf("%I64d\n", ans);
return 0;
}
CodeForces 364D Ghd (随机)
最新推荐文章于 2020-05-17 10:41:00 发布