当前位置 : 主页 > 编程语言 > c语言 >

AcWing 870. 约数个数

来源:互联网 收集:自由互联 发布时间:2023-08-25
题目 给定 $n$ 个正整数 $a_i$,请你输出这些数的乘积的约数个数,答案对 $10^9+7$ 取模。 输入格式第一行包含整数 $n$。 接下来 $n$ 行,每行包含一个整数 $a_i$。 输出格式输出一个整数,

JWvFczgRNg.jpg

题目

给定 $n$ 个正整数 $a_i$,请你输出这些数的乘积的约数个数,答案对 $10^9+7$ 取模。

输入格式 第一行包含整数 $n$。

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

输出格式 输出一个整数,表示所给正整数的乘积的约数个数,答案需对 $10^9+7$ 取模。

数据范围 $1≤n≤100,1≤a_i≤2×10^9$ 输入样例:

3
2
6
8

输出样例:

12

思路

约数个数定理: 对于一个大于1正整数n可以分解质因数: $n = {p_1}^{a_1}{p_2}^{a_2}...*{p_k}^{a_k}$ 则 $n$ 的正约数的个数就是 $sum = (a_1 + 1) * (a_2 + 1) * ... * (a_k + 1)$。 其中 $a1、a2、a3…ak$ 是 $p1、p2、p3,…pk$ 的指数。

定理简证 首先同上,$n$ 可以分解质因数:$n = {p_1}^{a_1}{p_2}^{a_2}...*{p_k}^{a_k}$, 由约数定义可知 ${p_1}^{a_1}$ 约数有: $p_1^0, p_1^1, p_1^2, ...$,共($a_1+1$)个;同理 ${p_2}^{a_2}$ 的约数有 $(a_2+1)$ 个;……;${p_k}^{a_k}$ 的约数有 $(a_k+1)$ 个。 故根据乘法原理:$n$ 的约数的个数就是 $(a_1+1)(a_2+1)(a_3+1)…(a_k+1)$。

本题中,我们通过试除法求出每个约数最大个数,即上述公式中的指数,将结果按公式计算即可。

代码

#include <iostream>
#include <unordered_map>

typedef long long LL;

using namespace std;

const int mod = 1e9 + 7;

int n;

int main()
{
    cin >> n;
    unordered_map<int, int> primes;
    
    while (n -- )
    {
        int x;
        cin >> x;
        
        for (int i = 2; i <= x / i; i ++ )
            while (x % i == 0)
            {
                x /= i;
                primes[i] ++;
            }
        
        if (x > 1) primes[x] ++ ;
    }
    
    LL res = 1;
    for (auto p: primes) res = res * (p.second + 1) % mod;
    
    cout << res << endl;
    
    return 0;
}
上一篇:团体程序设计天梯赛20分题目+题解合集
下一篇:没有了
网友评论