当前位置: 首页 > news >正文

算法刷题笔记 约数个数(详细注释的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,因此 1232 × 22 × 32 × 2 × 3 都是 12 的因数。

实现代码

#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;
}

相关文章:

  • 【Java】单元测试【主线学习笔记】
  • 通俗易懂的Latex使用步骤
  • RNA-seq通用代码-生物信息学pipeline001
  • 从博客到ICT社区:深化学习与交流的桥梁
  • 端上自动化测试平台实践
  • 不再兼容安卓,鸿蒙系统未来胜算几何?
  • 智能工厂的设计软件 设计目标:关乎对象的实践法则的认识论原则
  • 《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024
  • 物理学基础精解【30】
  • JAVA开源项目 足球俱乐部管理后台 计算机毕业设计
  • 18724 二叉树的遍历运算
  • Postgresql源码(136)syscache/relcache 缓存及失效机制
  • Debain docker容器离线安装ping命令
  • LIMS系统在设备管理中的核心价值
  • Windows下安装 LLama-Factory 保姆级教程
  • 分享的文章《人生如棋》
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Flannel解读
  • Hibernate最全面试题
  • mysql_config not found
  • python docx文档转html页面
  • Ruby 2.x 源代码分析:扩展 概述
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • tensorflow学习笔记3——MNIST应用篇
  • Vue.js源码(2):初探List Rendering
  • 订阅Forge Viewer所有的事件
  • 分类模型——Logistics Regression
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用putty远程连接linux
  • 手机端车牌号码键盘的vue组件
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #if 1...#endif
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序(布局、渲染层基础知识)
  • $forceUpdate()函数
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)php投票系统 毕业设计 121500
  • (算法)大数的进制转换
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (自用)交互协议设计——protobuf序列化
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core引入性能分析引导优化
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework 3.5安装教程
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池