C++——gcd例题——Half

Half

题目背景

SOURCE:NOIP2015-SHY-1

题目描述

给定 n 个数,求最大的数 m ,使得 m 是 n 个数中至少一半的数的约数。
注意:m 不一定在 n 个数中,只要满足要求即可。

输入格式

第一行一个整数 n ,表示数组大小。
第二行 n 个整数,表示数组的 n 个元素。

输出格式

输出一个整数,表示答案。

样例数据 1

输入


6 2 3 4 5 6

输出

3

备注

【样例说明】
3 是 6、3、6 的约数,达到了一半的要求;

【数据范围】
对 40% 的输入数据 : n≤100;
对 100% 的输入数据 :n≤100000;1≤数字的大小≤1012 。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int cnt,n;
long long a[1000001],c[1000001],v[100001],f[1000001];
mapevents;
long long gcd(long long a,long long b)
{
	if(!b) return a;
	return gcd(b,a%b);
}
int find(int n,long long aim)
{
	if(v[n]==aim) return n;
	int left=0,right=n,mid=(left+right)>>1;
	for(;left+1>1)
		if(v[mid]>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	srand(time(0));
	random_shuffle(a+1,a+n+1);
	long long ans=0;
	for(int i=1;i<=n&&i<=10;i++)
	{
		cnt=0;
		sort(c+1,c+cnt+1);
		int num=0;
		for(long long j=1;j*j<=a[i];j++)
			if(!(a[i]%j))
			{
				v[++num]=j;
				f[num]=0;
				if(j*j!=a[i])
				{
					v[++num]=a[i]/j;
					f[num]=0;
				}
			}
		sort(v+1,v+num+1);
		for(int j=1;j<=n;j++) ++f[find(num,gcd(a[i],a[j]))];
		for(int j=1;j<=num;j++)
		{
			long long total=0;
			if(v[j]<=ans) continue;
			for(int k=j;k<=num;k++)
				if(!(v[k]%v[j])) total+=f[k];
			if(total*2>=n) ans=max(ans,v[j]);
		}
	}
	cout<


你可能感兴趣的:(C++)