算法刷题笔记 约数个数(详细注释的C++实现)

文章目录

题目描述

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

输入格式

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

输出格式

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

数据范围

  • 1 ≤ n ≤ 100,
  • 1 ≤ ai ≤ 2×109

基本思路

  • 任何一个正整数都可以进行质因数分解,即表示为多个质数的乘积的形式。因此,本题中由多个正整数相乘得到的值很大的正整数,也可以表示为质因数相乘的形式,这个形式就是组成该正整数各个正整数的质因数分解结果的乘积。
  • 假如一个正整数可以分解为 k 个质数相乘的形式,那么这 k 个质数中任选出来 x 个数字(0 <= x <= k)相乘得到的仍然是该正整数的因数,因此可以认为一个正整数的所有因数就是这个正整数的质因数分解中的每一种部分组合情况。
  • 例如,正整数 12 可以质因数分解为 2 × 2 × 3,因此 1、2、3、2 × 2、2 × 3 和 2 × 2 × 3 都是 12 的因数。

实现代码

c 复制代码
#include <cstdio>
#include <unordered_map>
#include <cmath>
using namespace std;

// 【辅助常量定义】正整数个数的上限
const int N = 110;
// 【辅助常量定义】需要取模的值
const int MOD = 1000000007;

// 【变量定义】正整数的个数
int n;
// 【变量定义】存放所有正整数的数组
int arr[N];
// 【变量定义】记录所有正整数乘积的约数个数的变量
int result;

// 【函数定义】获取指定数组中所有正整数乘积的约数个数的函数
int get_factor_count(void)
{
    // 【变量定义】用于记录各个质因数及其指数的哈希表
    unordered_map<int, int> prime_factors;
    // 【算法第一步】对正整数数组中的每一个正整数逐一进行质因数分解
    for(int i = 0; i < n; ++ i)
    {
        // 获取当前需要进行质因数分解的正整数
        int current = arr[i];
        // 通过循环的方式,从小到大找出当前正整数的所有质因子
        for(int j = 2; j <= sqrt(current); ++ j)
        {
            // 能够整除,说明j是current的质因子
            while(current % j == 0)
            {
                // 修改current的值
                current /= j;
                // 将质因子添加到哈希表中
                if(prime_factors.count(j) != 0) ++ prime_factors[j];
                else prime_factors[j] = 1;
            }
        }
        // 判定是否有大于当前正整数的平方根的质因子
        if(current > 1)
        {
            if(prime_factors.count(current) != 0) ++ prime_factors[current];
            else prime_factors[current] = 1;
        }
    }
    // 【算法第二步】使用公式计算因数个数(取模后)
    long long temp_result = 1;
    // 通过遍历的方式,从哈希表中取出所有质因数的指数并进行计算
    for(auto it = prime_factors.begin(); it != prime_factors.end(); ++ it) temp_result = temp_result * (it -> second + 1) % MOD;
    // 最后进行取模并返回
    return temp_result;
}

int main(void)
{
    // 【变量输入】输入正整数的个数
    scanf("%d", &n);
    // 【变量输入】输入每一个正整数
    for(int i = 0; i < n; ++ i) scanf("%d", &arr[i]);
    // 【获取结果】通过自定义的函数获取所有正整数乘积的约数个数(取模10^9 + 7)
    result = get_factor_count();
    // 【结果输出】输出所有正整数乘积的约数个数
    printf("%d", result);
    return 0;
}
相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法