题解: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
浙公网安备 33010602011771号