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;
}

全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
07-01 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务