Codeforces Round #323 (Div. 2) C. GCD Table
C. GCD Table
题目链接:
http://codeforces.com/contest/583/problem/C
题意是给你n个数,可以构成n*n的GCD矩阵,矩阵里的元素顺序可以是任意的,让你求出这n个数...
首先我们能想到矩阵中最大的数就是答案,本身和本身的GCD就是本身(奇数个),而两个不同数的GCD会产生两个相同的GCD,可以发现矩阵中对角线就是答案...
所以我们可以取目前最大的数,让这个数和之前取到的数GCD一下,产生两个GCD数,然后从矩阵中删除...
下面是我的代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <map> using namespace std; const int MAXN = 250010; int a[MAXN]; map<int , int>mymap; vector<int> myv; bool cmp(int x , int y) { return x > y; } int GCD(int x , int y) { int temp; while(y) { temp = y; y = x % y; x = temp; } return x; } int main() { int n; while(~scanf("%d" , &n)) { for(int i = 0 ; i < n*n ; i++) { scanf("%d" , a + i); mymap[a[i]]++; } sort(a , a + n*n , cmp); for(int i = 0 ; i < n*n ; i++) { if(mymap[a[i]]) { mymap[a[i]]--; for(int j = 0 ; j < myv.size() ; j++) { mymap[GCD(a[i] , myv[j])] -= 2; } myv.push_back(a[i]); } } for(int i = 0 ; i < myv.size() - 1 ; i++) cout << myv[i] << " "; cout << myv[myv.size() - 1] << endl; } }