zoukankan      html  css  js  c++  java
  • 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;
        }
    }

      

  • 相关阅读:
    结构~函数~输入输出
    常用缀名
    结构
    枚举
    int argc char*argv[]
    字符串的操作
    字符串函数#include<string.h>
    指针的应用
    2019.1.25~2019.1.30学习总结
    v-for
  • 原文地址:https://www.cnblogs.com/Recoder/p/4854485.html
Copyright © 2011-2022 走看看