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--)
		{
			for(int j = i - 1; j > 0; j--)
				if(factor[i] % factor[j] == 0)
					count[j] += count[i];
			if(count[i] >= (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;
}