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

 

  

posted @ 2015-10-04 13:45  Recoder  阅读(181)  评论(0编辑  收藏  举报