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

      

  • 相关阅读:
    局部组件
    flex布局
    Websocket
    关于Javascript夜里再来分析下
    go build、go mod等命令
    websocket
    FileSystemWatcher使用
    DataGridView双缓冲
    C#读INI文件
    c 通过 COM接口调用 Excel.Application 问题终于解决
  • 原文地址:https://www.cnblogs.com/Recoder/p/4854485.html
Copyright © 2020-2023  润新知