
复杂度 $ O(\sqrt{n}) $
总体复杂度 $ 100 \times \sqrt{2 \times 10^{9}} \approx 4.5 \times 10^{6} $
点击查看代码
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N = 110, mod = 1e9 + 7;
unordered_map<int, int> primes;
void solve(int x)
{
for (int i = 2; i <= x / i; i ++) {
while (x % i == 0) {
x /= i;
primes[i] ++;
}
}
if (x > 1) primes[x] ++;
}
int main()
{
int n;
cin >> n;
while (n --) {
int x;
cin >> x;
solve(x);
}
LL res = 1;
for (auto prime : primes) res = res * (prime.second + 1) % mod;
cout << res << endl;
return 0;
}
- 约数个数的公式推导
① 由唯一分解定理可知,任何一个大于 $ 1 $ 的自然数 $ N $,如果 $ N $ 不为质数,都可以唯一分解成有限个质数的乘积 $ N = P_1^{\alpha_1} * P_2^{\alpha_2} * \cdots * P_n^{\alpha_n} $,这里 $ P_1 < P_2 < \cdots < P_n $ 均为质数,指数 \(\alpha_i\) 是正数;
② 任何一个质数也可以写成 $ N = P_1^{\alpha_1} * P_2^{\alpha_2} * \cdots * P_n^{\alpha_n} $ 的形式,只需让 \(P_n = N, \alpha_n = 1, \alpha_1=\alpha_2=\cdots=\alpha_{n-1}=0\);
③ 由 ① ② 可知对任何一个大于 1 的自然数 \(N\),都可以用 $ N = P_1^{\alpha_1} * P_2^{\alpha_2} * \cdots * P_n^{\alpha_n} $ 表示,其中 $ P_1 < P_2 < \cdots < P_n $ 均为质数,指数 \(\alpha_i\) 是非负数;(指数可以为 0 );
④ 约数个数 \(M=(\alpha_1+1)(\alpha_2+1)\cdots(\alpha_n+1)\),证明如下:因为对于 \(N\) 的任意一个约数 \(d\) ,都有 $ d = P_1^{\beta_1} * P_2^{\beta_2} * \cdots * P_n^{\beta_n} $,每一组 \(\beta_1\) ~ \(\beta_n\) 的组合对应一个约数,组合的个数等于约数的个数,故 \(N\) 的约数个数等于 \(\alpha_1\) ~ \(\alpha_i\) 组合个数,对于每一个 \(P_i\),指数可以取的值有 \(0\) ~ \(\alpha_i\),共 \(\alpha_i+1\) 个,故约数个数 \(M=(\alpha_1+1)(\alpha_2+1)\cdots(\alpha_n+1)\);
- primes 的 key 是 \(P_i\),value 是 \(\alpha_i\),返回迭代器中的 first 代表的是 \(P_i\),second 代表的是 \(\alpha_i\)
- int 范围内的整数,约数个数最大为 1536;