题目地址:
https://www.acwing.com/problem/content/873/
给定 n n n个正整数 a i a_i ai,输出它们的乘积的所有约数之和。答案对 1 0 9 + 7 10^9+7 109+7取模。
输入格式:
第一行包含整数
n
n
n。接下来
n
n
n行,每行包含一个整数
a
i
a_i
ai。
输出格式:
输出一个整数,表示所给正整数的乘积的约数之和,答案需对
1
0
9
+
7
10^9+7
109+7取模。
数据范围:
1
≤
n
≤
100
1\le n\le 100
1≤n≤100
1
≤
a
i
≤
2
×
1
0
9
1\le a_i\le 2\times 10^9
1≤ai≤2×109
对于一个正整数 x x x,若其质因子分解是 x = p 1 α 1 p 2 α 2 . . . p k α k x=p_1^{\alpha_1}p_2^{\alpha_2}...p_k^{\alpha_k} x=p1α1p2α2...pkαk,那么 x x x的约数个数是 ( 1 + p 1 + p 1 2 + . . . + p 1 α 1 ) ( 1 + p 2 + p 2 2 + . . . + p 2 α 2 ) . . . ( 1 + p k + p k 2 + . . . + p k α k ) (1+p_1+p_1^2+...+p_1^{\alpha_1})(1+p_2+p_2^2+...+p_2^{\alpha_2})...(1+p_k+p_k^2+...+p_k^{\alpha_k}) (1+p1+p12+...+p1α1)(1+p2+p22+...+p2α2)...(1+pk+pk2+...+pkαk)。我们可以统计每个 a i a_i ai的各个质因子个数,最后按照上面公式求乘积的约数个数。代码如下:
#include <iostream>
#include <unordered_map>
using namespace std;
const int MOD = 1e9 + 7;
unordered_map<int, int> map;
// 套用分解质因数模板
void divide(int n) {
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
int c = 0;
while (n % i == 0) {
c++;
n /= i;
}
map[i] += c;
}
}
if (n >= 2) map[n]++;
}
int main() {
int n;
cin >> n;
while (n--) {
int x;
cin >> x;
divide(x);
}
long res = 1;
for (auto pa : map) {
int p = pa.first, a = pa.second;
long t = 1;
while (a--) t = (t * p + 1) % MOD;
res = res * t % MOD;
}
cout << res << endl;
return 0;
}
时间复杂度 O ( ∑ a i ) O(\sum \sqrt a_i) O(∑ai),空间 O ( k ) O(k) O(k), k k k为不同质因子总个数。