1 条题解

  • 0
    @ 2023-12-3 12:30:50

    可以复习:

    1. 求因子
    2. map作为索引字典的用法。

    其他就纯粹是数学脑袋了。

    问题:

    在m个数中挑n个数,求这n个数可能的最大公约数。

    思路:

    我们对m个数的所有因子(假设个数为x)进行个数统计:

    准备x个盒子,盒子上写上因子,盒子中的小球数为这个因子出现的总次数。 显然,要找“n个数的共同因子”,只要找出所有小球数>n的盒子。 这些盒子里面,编号最大的那个,就是所求的最大公约数。

    #include <bits/stdc++.h>
    using namespace std;
    
    map<int, int> mep;
    void factor(int a) { //为所有因数建立次数索引 
        for (int i=1; i*i <= a; i++) 
            if (a%i == 0) {
                mep[i]++;
                if (a/i!=i) mep[a/i]++;
            }
    }
    
    int main() {
        mep.clear();
        int n,m,mex=0;
        cin >> n;
    
        for (int i=0; i<n; i++) {
            cin>>m;
            factor(m);
            mex=max(m,mex);
        }
    
        for (int i=1; i<=n; i++){
            //对于i,找到所有mep[x]>=i中最大的x(未出现的因数将被跳过)
            while (mep[mex]<i) mex--; 
            cout<<mex;
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    414
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    17
    已通过
    5
    上传者