Logo Wy Online Judge

WyOJ

Paste!

#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <random>

int main() {
	using namespace std;
	int n;
	cin >> n;
	auto arr = new int64_t[n];
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	auto solve = [&] (int64_t base) -> int64_t {
		vector<int64_t> factor;
		for (int64_t i = 1; i * i <= base; i++)
			if (base % i == 0)
			{
				factor.push_back(i);
				if (i != base / i)
					factor.push_back(base / i);
			}
		sort(factor.begin(), factor.end());
		auto count = new int[factor.size()]();
		for (int i = 0; i < n; i++)
			++count[lower_bound(factor.begin(), factor.end(), gcd(arr[i], base))
			        - factor.begin()];
		for (int i = factor.size() - 1; i > 0; i--)
		{
			int cnt = count[i];
			for (int j = i + 1; j < factor.size(); j++)
				if (factor[j] % factor[i] == 0)
					cnt += count[j];
			if (cnt >= (n + 1) / 2)
			{
				delete[] count;
				return factor[i];
			}
		}
		delete[] count;
		return 1;
	};
	mt19937 rng(1312537);
	uniform_int_distribution<> dist(0, n - 1);
	int64_t ans = 1;
	for (int i = 0; i < 11; i++)
		ans = max(ans, solve(arr[dist(rng)]));
	cout << ans << endl;
	delete[] arr;
	return 0;
}