题解:AcWing 871 约数之和

【题目来源】

AcWing:871. 约数之和 - AcWing题库

【题目描述】

给定 \(n\) 个正整数 \(a_i\),请你输出这些数的乘积的约数之和,答案对 \(10^9+7\) 取模。

【输入】

第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一个整数 \(a_i\)

【输出】

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 \(10^9+7\) 取模。

【输入样例】

3
2
6
8

【输出样例】

252

【算法标签】

《AcWing 871 约数之和》#数学知识# #约数# #试除法# #因式分解#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

// 定义常量 N 和 mod
const int N = 105, mod = 1e9 + 7;

// 使用 unordered_map 来存储每个质数及其出现的次数
unordered_map<int, int> primes;

// 定义变量 n 和 a
int n, a;

int main()
{
    // 读取输入的整数 n
    cin >> n;
    
    // 循环 n 次,每次读取一个整数 a
    while (n--)
    {
        cin >> a;
        
        // 对 a 进行质因数分解
        for (int i = 2; i <= a / i; i++)
        {
            // 如果 a 能被 i 整除,则将 a 除以 i,并增加 i 的计数
            while (a % i == 0)
            {
                a /= i;
                primes[i]++;
            }
        }
        
        // 如果 a 大于 1,则 a 本身是一个质数,增加其计数
        if (a > 1) primes[a]++;
    }
    
    // 初始化答案 ans 为 1
    long long ans = 1;
    
    // 遍历 primes 中的每个质数及其出现次数
    for (auto p : primes)
    {
        long long k = p.first, v = p.second;
        long long t = 1;
        
        // 计算 (k^v + k^(v-1) + ... + k + 1) % mod
        while (v--) t = (t * k + 1) % mod;
        
        // 更新答案 ans
        ans = ans * t % mod;
    }
    
    // 输出最终答案
    cout << ans << endl;
    return 0;
}

【运行结果】

3
2
6
8
252
posted @ 2026-02-23 08:43  团爸讲算法  阅读(1)  评论(0)    收藏  举报