/**
codeforce 583C GCD
给出一个数列任意两个元素的gcd矩阵,求原数列。
给出的gcd矩阵的顺序是任意的。
首先给出数列中最大元素肯定是原序列中的数,
然后不断取剩下数中的最大值,与已经求出来的数进行gcd,并在原数列中删去这些已经求出来的数。
**/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
using namespace std;
multiset<int> ms;
vector<int> ans;
int gcd(int a,int b){
if(b == 0) return a;
return gcd(b,a%b);
}
int main(){
int n,x;
cin >> n;
for(int i=0;i<n*n;i++){
cin >> x;
ms.insert(x);
}
ans.push_back(*(--ms.end()));
ms.erase(--ms.end());
while(!ms.empty()){
int x = *(--ms.end());
ms.erase(--ms.end());
//cout << x << " " << ms.size() << endl;
for(int i = 0; i < ans.size();i++){
int y = ans[i];
ms.erase(ms.find(gcd(x,y)));
ms.erase(ms.find(gcd(x,y)));
}
ans.push_back(x);
}
for(int i=0;i<ans.size();i++){
cout << ans[i] << (i == ans.size()-1 ? '\n': ' ');
}
return 0;
}
codeforce 583C GCD
最新推荐文章于 2019-02-11 21:18:57 发布