zoukankan      html  css  js  c++  java
  • 约数个数&约数之和

    给一个数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;
    
  • 相关阅读:
    MINIX文件系统
    Cmd Markdown 语法
    asp.net mvc 4 json大数据异常 提示JSON字符长度超出限制的异常[转载]
    echart 拖拽
    搭建django开发环境
    Django 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库
    二、PyCharm 创建Django 第一个项目
    一、Django 安装
    python 连接各类主流数据库简单示例【转载】
    Python 3.6 连接mssql数据库(pymssql 方式)
  • 原文地址:https://www.cnblogs.com/tomori/p/14246828.html
Copyright © 2011-2022 走看看