(寒假练习 AcWing 870)约数个数(数论)

Posted チノ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(寒假练习 AcWing 870)约数个数(数论)相关的知识,希望对你有一定的参考价值。

原题链接(戳我~)

题目描述

给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对109+7取模。

输入格式

第一行包含整数n。

接下来n行,每行包含一个整数ai。

输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对109+7取模。

数据范围

$ 1≤n≤100,$
\(1≤ai≤2?10^9\)

输入样例:

3
2
6
8

输出样例:

12

解题思路

根据算数的进本定理可知任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 \(N=P_1^{a_1}\times P_2^{a_2} \times P_3^{a_3} \times P_4^{a_4}\times...\times P_n^{a_n}(P_1,P_2,P_3...P_n均为质数)\) 那么该数 N 的约数个数为: \((a1 + 1)\times (a_2 + 1)\times (a_3 + 1)\times (a_4 + 1)\times ...\times (a_n+1)\) 所以我们直接根据公式一步步向下求即可。

代码样例

#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long ll;

const ll MOD = 1e9 + 7;
unordered_map<int,int> hash;

int main(){
    int t;
    cin >> t;
    while(t--){   // 质因数分解
        ll n;
        cin >> n;
        for (int i = 2; i*i <= x; ++i){
            while(n % i == 0){
                hash[i] ++;
                n /= i;
            }
        }
        if (n > 1)
            hash[n] ++;  // 这一步不要忘记了
    }
    ll ans = 1;
    for (auto n:hash){  // 约数的个数 (N1 + 1)*(N2 + 1)*(N3 + 1)*...
        ans = ans*(n.second + 1) % MOD;  // 别忘了取模
    }
    cout << ans << endl;
    return 0;
}

完~

以上是关于(寒假练习 AcWing 870)约数个数(数论)的主要内容,如果未能解决你的问题,请参考以下文章

算法AcWing 870. 约数个数

870. 约数个数

数论考试题(b) 求约数的约数的最大个数

AcWing 198. 反素数 约数个数+dfs

数论杂记——约数个数定理

AcWing 1294. 樱花 数学推导+约数个数