约数个数&约数之和

给一个数n,求它的约数个数

因为n可以唯一分解成质因数的乘积即(n = p_1^{alpha1}p_2^{alpha2}...p_t^{alpha t}),所以n的约数c的形式应该是(c= p_1^{eta1}p_2^{eta2}...p_t^{eta t}),对于任何两组不同的(eta 1,...,eta t)的取值,由算数基本定理得c是不同的,由于(eta i)的取值为(0,1,...,alpha i)((alpha i + 1))种,所以由乘法原理得:n约数个数为((alpha 1 + 1) imes...(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}) imes...(p_t^{0}+p_t^{1}+...+p_t^{alpha t})),把右侧展开,共有((alpha 1 + 1) imes...(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;
原文地址:https://www.cnblogs.com/tomori/p/14246828.html