约数的个数

1. 问题描述

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

2. 唯一分解定理

对于任意的正整数 N N N都可以分解成:
N = ∑ i = 0 p i α i N = \sum_{i = 0}p_i^{\alpha _i} N=i=0piαi

其中 p i p_i pi是N的质因数。

3.约数的个数

约数的个数等于:
( α 1 + 1 ) ∗ ( α 2 + 1 ) ∗ . . . ∗ ( α n + 1 ) ({\alpha}_1 + 1)*({\alpha}_2 + 1) *...*({\alpha}_n + 1) (α1+1)(α2+1)...(αn+1)

因为每一种约数指数从 [ 0 , α i ] 共 有 ( α i + 1 ) [0, {\alpha_i}]共有({\alpha_i}+1) [0,αi](αi+1),N的约数的等于每一种约数取出其中的一个进行相乘。所以使用乘法原理得到上面的式子。

4.代码

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;

int main() {
    int n;
    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) {
                primes[i] ++;
                x /= i;
            }
        }
        if (x > 1) primes[x] ++;
    }
    LL res = 1;
    for (auto &[prime, nums] : primes) {
        // printf("prime = %d nums = %d\n", prime, nums);
        res = res * (nums + 1) % mod;
    }
    cout << res << endl;
    return 0;
}

5.注意

  1. 最后如果x > 1说明还有较大的质因数,应该统计进去。
  2. 注意使用LL保存,并且取余。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值