约数之和

原题链接:https://www.acwing.com/problem/content/description/873/

给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。

输入格式

第一行包含整数 n

接下来 n 行,每行包含一个整数 ai

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7 取模。

 

算法思路:

任意一个数x,都可以唯一分解分解为如下形式:x = p1kp2kp3k3...pnkn

其中p1, p2, p3, pn都为质数,那么x的所有约数之和可以表示为(1+p1+p12+...+p1k1)(1+p2+p22+...+p2k2)...(1+pn+pn2+...+pnkn)

 

代码实现:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>

using namespace std;
typedef long long LL;

const int MOD = 1e9 + 7;

unordered_map<int, int> primes;

int main()
{
    int n;
    LL res = 1;
    cin >> n;
    while(n--)
    {
        int x;
        cin >> x;
        for(int i=2;i<=x/i;i++)
        {
            while(x % i == 0)
            {
                x = x / i;
                primes[i]++;
            }
        }
        if(x > 1) primes[x]++;
    }
    
    for(auto& [k, v]: primes)
    {
        LL s = 1;
        while(v--)
        {
            s = (s * k + 1) % MOD;
        }
        res = (res * s) % MOD;
    }
    
    cout << res << endl;
    
    return 0;
}

 

posted @ 2022-09-13 23:54  krystalZ2021  阅读(46)  评论(0)    收藏  举报