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

2021-01-15 18:12

阅读:606

标签:iostream   wing   思路   格式   turn   auto   mat   公式   script   

原题链接(戳我~)

题目描述

给定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)\) 所以我们直接根据公式一步步向下求即可。

  • 看了许多dalao们写的题解全部都是用了一个叫“unordered_map”的容器。emmm......有关unordered_map的讲解请移步至(STL之unordered_map)暂时未写

代码样例

#include
#include
using namespace std;
typedef long long ll;

const ll MOD = 1e9 + 7;
unordered_map hash;

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

完~

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

标签:iostream   wing   思路   格式   turn   auto   mat   公式   script   

原文地址:https://www.cnblogs.com/cafu-chino/p/12237912.html


评论


亲,登录后才可以留言!