$\Huge\color{orchid}{点击此处获取更多干货}$
算术基本定理
算术基本定理的表达式为$N= {\textstyle \prod_{i=1}^{k}} (p_i^{a_i})$
由这个表达式,还可以推导出两个比较重要的,关于约数的推论,这次先介绍其中之一:如果一个数能按照上述方法分解,那么它的约数个数$S(N)={\textstyle \prod_{i=1}^{k}} (a_i+1)$
下面这张图,可以说明这个表达式如何得出的:
本质上说,$N$的每个不同的约数,都可以通过对序列${d_k}$中每个元素赋予不同的值,代入上图中最下面的表达式中求得,每一个$d_i$都有$(a_i+1)$个值可选,根据小学就学过的乘法原理,约数个数的表达式就显而易见了
C++ 代码
对若干个数的乘积求约数个数,可以分别对这些数分解质因数,乘起来之后底数相同的项,其指数会加在一起,最后会得到一个新的分解表达式。
#include <iostream>
#include <unordered_map>
using namespace std;
const size_t MOD = 1e9 + 7;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
unordered_map<int, int> primes;
int n, x;
cin >> n;
/**
* @brief 分解质因数
* @param x 待分解的数
* @return void
* 质因数分解结果存入相同哈希表
* @warning 记得对哈希表用引用传递,否则报错
*/
auto primeFactorization = [&](int x) {
for (int i = 2; i <= x / i; i++) {
while (x % i == 0) {
primes[i]++;
x /= i;
}
}
if (x > 1) {
primes[x]++;
}
};
while (n--) {
cin >> x;
primeFactorization(x);
}
//代入表达式,每乘一项就取模
size_t ans = 1;
for (auto& [p, a] : primes) {
ans = (ans * (a + 1)) % MOD;
}
cout << ans << endl;
return 0;
}