您的位置:首页 > 其它

Codeforces Round #323 (Div. 2) C. GCD Table

2015-10-04 13:45 309 查看
        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;
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: