1. 程式人生 > 實用技巧 >約數個數&約數之和

約數個數&約數之和

給一個數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;