約數個數&約數之和
阿新 • • 發佈:2021-01-07
給一個數n,求它的約數個數
因為n可以唯一分解成質因數的乘積即\(n = p_1^{\alpha1}p_2^{\alpha2}...p_t^{\alpha t}\),所以n的約數c的形式應該是\(c= p_1^{\beta1}p_2^{\beta2}...p_t^{\beta t}\),對於任何兩組不同的\(\beta 1,...,\beta t\)的取值,由算數基本定理得c是不同的,由於\(\beta i\)的取值為\(0,1,...,\alpha i\)共\((\alpha i + 1)\)種,所以由乘法原理得:n約數個數為\((\alpha 1 + 1)\times...(\alpha t + 1)\)
給定n個正整數ai,請你輸出這些數的乘積的約數個數,答案對1e9+7取模。
#include<iostream> #include<unordered_map> using namespace std; #define LL long long const int mod = 1e9 + 7; int n; unordered_map<int, int> primes; int main(){ cin >> n; while(n --){ int a; cin >> a; for(int i = 2; i <= a / i; i ++) if(a % i == 0) while(a % i == 0){ a /= i; primes[i] ++; } if(a > 1) primes[a] ++; } LL res = 1; for(auto t : primes) res = res * (t.second + 1) % mod; cout << res; return 0; }
給一個數n,求它的約數之和
公式:\(sum = (p_1^{0}+p_1^{1}+...+p_1^{\alpha1})\times...(p_t^{0}+p_t^{1}+...+p_t^{\alpha t})\),把右側展開,共有\((\alpha 1 + 1)\times...(\alpha t + 1)\)項相加,並且每一項都是一個約數。
給定n個正整數ai,請你輸出這些數的乘積的約數之和,答案對1e9 + 7取模。
#include<iostream> #include<unordered_map> using namespace std; #define LL long long const int mod = 1e9 + 7; int n; unordered_map<int, int> primes; int main(){ cin >> n; while(n --){ int a; cin >> a; for(int i = 2; i <= a / i; i ++) if(a % i == 0) while(a % i == 0){ a /= i; primes[i] ++; } if(a > 1) primes[a] ++; } LL res = 1; for(auto prime : primes){ int a = prime.first, b = prime.second; // a為底數,b為指數 LL t = 1; while(b --) t = (t * a + 1) % mod; res = res * t % mod; } cout << res; return 0; }
程式碼裡有一個計算\(1 + p^1 + p^2 + p^3 +… + p^a\)多項式的技巧:
res = 1
for(int i = 1; i <= a; i ++) res = res * p + 1;