Codeforces 583 DIV2 GCD Table 贪心
原题链接:http://codeforces.com/problemset/problem/583/C
题意:
大概就是给你个gcd表,让你还原整个序列。
题解:
由$GCD(a,a)=a$,我们知道最大的那个数一定是原序列中的数,然后每次从集合中选取最大的数出来,和已经构造好的序列进行gcd,删除gcd出来的值即可。
代码:
#include<iostream> #include<cstring> #include<map> #include<cstdio> #include<set> #include<algorithm> #include<vector> using namespace std; int gcd(int a, int b){ return b==0?a:gcd(b,a%b); } map<int,int> ma; vector<int> ans; int n; int main() { cin.sync_with_stdio(false); cin >> n; for (int i = 0; i < n * n; i++) { int x; cin >> x; ma[-x]++; } if (n == 1) { cout << -ma.begin()->first << endl; return 0; } auto it=ma.begin(); while(it!=ma.end()) { while (it != ma.end() && it->second == 0)it++; if(it==ma.end())break; it->second--; for (auto c:ans)ma[-gcd(c, -it->first)] -= 2; ans.push_back(-it->first); } for (auto c:ans) cout << c << " "; cout << endl; return 0; }