【算法】约数个数(数论)

题目

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

输入格式

第一行包含整数 n。

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

输出格式

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

数据范围

1≤n≤100

1≤ai≤2×1e9

输入样例:

复制代码
3
2
6
8

输出样例:

复制代码
12

思路

首先,输入n表示接下来要输入的数的个数。然后使用unordered_map来记录每个质因子以及其出现的次数。接下来,通过循环输入每个数x,并使用一个嵌套循环找出x的所有质因子,同时统计它们出现的次数,并将结果存储在primes中。最后,遍历primes中的每个质因子及其次数,计算约数个数的乘积并输出结果。

代码段1

这段代码的作用是将一个数拆分为它的质因子,并统计每个质因子出现的次数。

首先,从2开始遍历到sqrt(x),判断是否为x的质因子。如果当前数i是x的质因子,就不断除以i,并统计i出现的次数。通过循环while (x % i == 0),如果x能整除i,则x除以i,并将i的次数增加1。

最后,如果x大于1,说明x本身就是一个质数,将其加入primes中,并将其次数增加1。

这样,经过这段代码的处理,primes中存储了输入数的所有质因子以及它们出现的次数。

代码段2

在计算约数个数时,我们需要考虑每个质因子出现的次数。对于一个质因子p,它可以出现0次、1次、2次、...、p.second次,共有**(p.second + 1)**种选择。

例如,假设一个数的质因子分别为2、3、5,对应的次数分别为2、1、3。那么这个数的约数个数就是(2+1)*(1+1)*(3+1)=24个。其中,每个质因子的次数加1是为了包括不选择该质因子的情况。

因此,在这段代码中,遍历primes中的每个质因子及其次数时,将每个质因子的次数加1,并累乘到变量res中,用于计算约数个数的乘积。最后输出res即为约数个数的结果。

代码

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

typedef long long LL;

const int N = 110, mod = 1e9 + 7;

int main()
{
    int n;
    cin >> n; // 输入n,表示接下来要输入的数的个数

    unordered_map<int, int> primes; // 用unordered_map记录每个质因子以及其出现的次数

    while (n--)
    {
        int x;
        cin >> x; // 输入一个数x

        for (int i = 2; i <= x / i; i++) // 从2开始遍历到sqrt(x),判断是否为x的质因子
            while (x % i == 0) // 若i是x的质因子,则不断除以i,并统计i出现的次数
            {
                x /= i;
                primes[i]++;
            }

        if (x > 1) primes[x]++; // 若x本身就是质数,则将其加入primes中
    }

    LL res = 1; // 计算约数个数时的结果
    for (auto p : primes) res = res * (p.second + 1) % mod; // 遍历primes中的每个质因子及其次数,计算约数个数的乘积
    cout << res << endl; // 输出约数个数的结果

    return 0;
}

题目来自:870. 约数个数 - AcWing题库

相关推荐
2301_800256111 分钟前
【人工智能引论期末复习】第3章 搜索求解2 - 对抗搜索
人工智能·算法·深度优先
程序猿阿伟9 分钟前
《量子算法开发实战手册:Python全栈能力的落地指南》
python·算法·量子计算
老鼠只爱大米35 分钟前
LeetCode算法题详解 438:找到字符串中所有字母异位词
算法·leetcode·双指针·字符串匹配·字母异位词·滑动窗口算法
地平线开发者1 小时前
征程 6 | 平台 QAT 精度一致性问题分析流程
算法·自动驾驶
mjhcsp1 小时前
C++ Manacher 算法:原理、实现与应用全解析
java·c++·算法·manacher 算法
AlenTech1 小时前
198. 打家劫舍 - 力扣(LeetCode)
算法·leetcode·职场和发展
Z1Jxxx1 小时前
0和1的个数
数据结构·c++·算法
ldccorpora1 小时前
Chinese News Translation Text Part 1数据集介绍,官网编号LDC2005T06
数据结构·人工智能·python·算法·语音识别
重生之后端学习1 小时前
21. 合并两个有序链表
java·算法·leetcode·链表·职场和发展
源代码•宸1 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang