1. 问题描述
给定 n 个正整数 ai,请你输出这些数的乘积的约数个数,答案对 109+7 取模。
2. 唯一分解定理
对于任意的正整数
N
N
N都可以分解成:
N
=
∑
i
=
0
p
i
α
i
N = \sum_{i = 0}p_i^{\alpha _i}
N=i=0∑piαi
其中 p i p_i pi是N的质因数。
3.约数的个数
约数的个数等于:
(
α
1
+
1
)
∗
(
α
2
+
1
)
∗
.
.
.
∗
(
α
n
+
1
)
({\alpha}_1 + 1)*({\alpha}_2 + 1) *...*({\alpha}_n + 1)
(α1+1)∗(α2+1)∗...∗(αn+1)
因为每一种约数指数从 [ 0 , α i ] 共 有 ( α i + 1 ) [0, {\alpha_i}]共有({\alpha_i}+1) [0,αi]共有(αi+1)个,N的约数的等于每一种约数取出其中的一个进行相乘。所以使用乘法原理得到上面的式子。
4.代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
int main() {
int n;
cin >> n;
unordered_map<int, int>primes;
while (n --) {
int x;
cin >> x;
for (int i = 2; i <= x / i; i++) {
while (x % i == 0) {
primes[i] ++;
x /= i;
}
}
if (x > 1) primes[x] ++;
}
LL res = 1;
for (auto &[prime, nums] : primes) {
// printf("prime = %d nums = %d\n", prime, nums);
res = res * (nums + 1) % mod;
}
cout << res << endl;
return 0;
}
5.注意
- 最后如果x > 1说明还有较大的质因数,应该统计进去。
- 注意使用LL保存,并且取余。