Codeforces 582A

做~自己de王妃 提交于 2019-12-01 15:43:28

长度为$N$的数列{a_i}的GCD Table定义为一个$Ntimes N$的表,表中元素$b_{ij}=gcd(a_i,a_j)$。
现给你一个GCD Table中的所有数,要求输出原数列中的所有元素。

数据范围

$N leq 500$

做法

注意到:$gcd(a,b)≤min(a,b)$ 。

所以,最大的$gcd$值一定在原数列中出现,将此数从所给的数中去掉。剩下的数中,最大的数也一定在原数列中。将此数从所给的数中去掉,再将此数与之前得出的原数列中的数的$gcd$从所给的数中去掉。不断重复此过程,直到所给的数都被去掉。

代码

1234567891011121314151617181920212223242526272829303132
using namespace std;const int MAX_N = 505;int N, a[MAX_N * MAX_N];vecto 大专栏  Codeforces 582Ar<int> ans;map<int, int> mp;map<int, int>::iterator it;int (){	cin >> N;	for (int i = 0; i < N * N; ++i) scanf("%d", a + i), mp[-a[i]]++;	it = mp.begin();	ans.push_back(-it->first); --(it->second);	for (; ;) {		while (it->second == 0) {			it++;			if (it == mp.end()) break;		}		if (it == mp.end()) break;		for (int i = 0; i < (int)ans.size(); ++i) {			mp[-__gcd(ans[i], -it->first)] -= 2;		}		ans.push_back(-it->first);		--(it->second);	}	for (int a : ans) printf("%d ", a);	puts("");	return 0;}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!