约数的个数和约数之和

在这里插入图片描述

对任意一个数N,d是N的一个约数,他们可以写成下列格式
在这里插入图片描述
约数个数就转化为等于每个因子有多少种选法
在这里插入图片描述
在int范围内,约数最多的数有大概1500个约数。

代码实现

//先对a1, a2,,...an 分别分解,再套用公式
#include<iostream>
#include<algorithm>
#include<unordered_map>

using namespace std;
const int mod = 1e9 + 7;
unordered_map<int, int > table;

int n;

int main(){
    
    
    cin >> n;
    while( n --){
    
    
        int x;
        cin >> x;
        
        for(int i = 2; i <= x / i; i++){
    
    
            if(x % i == 0){
    
    
                while(x % i == 0){
    
    
                    table[i] ++;
                    x /= i;
                }
            }
        }
        if(x > 1) table[x] ++;
    }
    long long res = 1;
    for(auto i:table){
    
    
        res = res * (i.second + 1) % mod;
    }
    cout << res << endl;
    return 0;
}

约数之和 等于
在这里插入图片描述

//先对a1, a2,,...an 分别分解,再套用公式
#include<iostream>
#include<algorithm>
#include<unordered_map>

using namespace std;
const int mod = 1e9 + 7;
unordered_map<int, int > table;

int n;

int main(){
    
    
    cin >> n;
    while( n --){
    
    
        int x;
        cin >> x;
        
        for(int i = 2; i <= x / i; i++){
    
    
            if(x % i == 0){
    
    
                while(x % i == 0){
    
    
                    table[i] ++;
                    x /= i;
                }
            }
        }
        if(x > 1) table[x] ++;
    }
    long long res = 1;
    for(auto i:table){
    
    
        int num = i.second, t = i.first;
        
        long long sum = 1;  //记录对一个约数的等比数项的和。(p1^0 + p1^1 + p1^2 + p1^a1)的和
        for(int j = 1; j <= num; j++){
    
    
            sum =( sum * t + 1) % mod;
        }
        res = res * sum % mod;
    }
    cout << res << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44879626/article/details/108065511