题目地址:
https://www.acwing.com/problem/content/872/
给定 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 + 1 ) ( α 2 + 1 ) . . . ( α k + 1 ) (\alpha_1+1)(\alpha_2+1)...(\alpha_k+1) (α1+1)(α2+1)...(αk+1)。所以我们可以统计每个 a i a_i ai的各个质因子个数,最后按照上面公式求乘积的约数个数。代码如下:
#include <iostream>
#include <unordered_map>
using namespace std;
const int MOD = 1e9 + 7;
unordered_map<int, int> mp;
void divide(int n) {
for (int i = 2; i <= n / i; i++) {
if (n % i == 0)
while (n % i == 0) {
mp[i]++;
n /= i;
}
}
if (n >= 2) mp[n]++;
}
int main() {
int n;
cin >> n;
while (n--) {
int x;
cin >> x;
divide(x);
}
long res = 1;
for (auto p : mp) res = res * (p.second + 1) % MOD;
printf("%ld\n", res);
}
时间复杂度 O ( ∑ ∑ i α i ) O(\sum\sum_i \alpha _i) O(∑∑iαi),空间 O ( k ) O(k) O(k), k k k为不同质因子总个数。