[AcWing 870] 約數個數
阿新 • • 發佈:2022-05-08
點選檢視程式碼
#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 p : primes) res = res * (p.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\) - primes 的 key 是 \(P_i\),value 是 \(\alpha_i\),返回迭代器中的 first 代表的是 \(P_i\),second 代表的是 \(\alpha_i\)
- int 範圍內的整數,約數個數最大為 1536;