P1414 又是毕业季II

1首先你要知道,N个数的最大GCD就是这N个数共同约数中最大的那个,用Map将一个约数出现的次数存起来(次数即为有多少个数中有着个约数),对每个数约数枚举,结果放到Map里面,最后输出的时候,倒着找符合条件的约数即可,最后一点很重要,就是N越大,他的最大GCD会越小,所以复杂度是远远小于N*(Map.size())的

#pragma GCC optimize(2)
#include<bits/stdc++.h>

using namespace std;

#define pi acos(-1.0)
#define e exp(1.0)
typedef long long ll;
const ll maxn=1e4+7;
ll N;
map<ll,ll>Ma;
map<ll,ll>::reverse_iterator it;
//inline ll read()
//{
// ll X=0; bool flag=1; char ch=getchar();
// while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
// while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
// if(flag) return X;
// return ~(X-1);
//}
//inline void write(ll X)
//{
// if(X<0) {X=~(X-1); putchar('-');}
// if(X>9) write(X/10);
// putchar(X%10+'0');
//}
void Han(ll n)
{
	ll i,j;
	for(i=1;i*i<=n;i++)
	{
		if(n%i==0)
		{
			Ma[i]++;
			if(i!=n/i)
			Ma[n/i]++;
		}
	}
	return ;
}
int main()
{
// freopen(".../.txt","w",stdout);
// ios::sync_with_stdio(false);
	while(~scanf("%lld",&N))
	{
		ll i,j;
		Ma.clear();
		for(i=0;i<N;i++)
		{
			ll n;
			scanf("%lld",&n);
// n=read();
			Han(n);
		}
		it=Ma.rbegin();//只需赋值一次 
		for(i=1;i<=N;i++)
		{
			while(it->second<i)
			it++;
// write(it->first);
			printf("%lld\n",it->first);
			putchar('\n');
		}
	}
	return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务