约数个数(数论,蓝桥杯)

news/2024/5/20 1:29:44/文章来源:https://blog.csdn.net/2302_76987120/article/details/137026506

题目描述:

  给定一个数n,再给出n个数,现在要求你求出这些数的乘积的约数个数总和,结果对1e9+7取模。

取值范围:1<n<100; 1<ni<2e9;

分析步骤:

  第一:要求约数的个数,我们有许多的求法,比如试除法,线性筛法求。那么本文就将两种方法都讲一遍。题目中说要求出给出的数的乘积的约数个数,如果我们真的去求出了数的乘积总和,那么一定会溢出int函数因为 ni 最大值为2e9只要稍微再乘个数都会超过,所以我们仔细想想,其实我们只需要把每一个数都拆成约数,把他们的约数是哪些分别都统计一下,再结合公式就可以得到最终的答案

第二:试除法求出约数个数。

  1. 输入一个n,再用while循环不断地将数输入进去,定义有一个哈希表first代表着具体的约数是哪个;second代表着这个约数有多少。

  2. 用for循环不断地去寻找,如果 i 是x的约数的话那么就将mp[i]++那么约束大小为i的个数就++,再将 x 除去i ,直到 i 不再是x的约数的话,while循环结束。在判断一下最终剩下来的数是不是 1 , 如果不是1的话那么这个数就也是一个约数我们将其存储起来。

  3. 定义res为1,运用迭代器向后遍历,利用公式将每一个约数的个数+1的和相乘得到的就是最终的答案。

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
typedef long long LL;
const int N = 1e6+10 , MOD = 1e6+1;unordered_map<int, int >mp;int main()
{int n ; cin>>n;while(n --){int x ; cin>>x;for(int i = 2 ; i <= x / i ; i++){while(x % i == 0){mp[i]++;x/=i;}}if(x > 1) mp[x]++;}LL res = 1;for(auto t : mp){res *= (1+t.second) % MOD;}cout<<res;return 0;
}

 但是我们知道其实试除法求出约数个数时间复杂度为根号n,那么当求1~n的所有约数的个数的时候时间复杂度为n根号n那么只要数据量稍微大一点就会超时,所以接下来我们介绍欧拉筛也就是线性筛法将时间复杂度优化为n。 

  第三:线性筛法求出1~n的约数个数

  1. 既然是线性筛法我们就要套用线性筛的模板,

  2. 首先明确一下我们的数组分别是有什么用 p[N] 收集质数, vis[N]判断此数是否遍历过 ,  a[N]记录 i 的最小质数出现的次数 ; d[N] i 数的约数个数;

  3. 初始化d[1]为1,用for循环去遍历,如果这个值是没有被遍历过的那么这个值就一定是质数,我们把他收集进入我们的 p 数组,更新d[i]为2,因为由于该数是个质数那么他的约数就一定只有1 和 他们本身,所以d[i]的约数个数为2,更新a[i]为1,因为该数是质数所以他最小的质数出现的次数也一定是他本身所以是1。

  4. 再用for循环让后面的值一定只被他最小的质因子给除去我们将该点定义为true表示该点不是质数,

  5. 进入判断如果:i % p[j] == 0 。 由于p[j]一定是它最小的质因子所以这个式子成立的话,就代表着a[m] 比 a[i] 多了一个质因子所以加1.所以现在的d[m]和原来的比起来,就只有c1那部分有点差别,所以只要除去原来的部分,再乘上新加的部分就可以得出答案了。

  6. 如果判断式子不成立的话则代表这个数是一个新的质因子,因为新的质因子的话那就只有两个约数(1和本身),只有一个质因子(本身),所以我们更新a[m]为1更新d[m]则为2*d[i]因为我们看看公式他是要将质因子个数+1的和相乘,所以比原来多了一个质因子套入公式(1+1)== 2 所以是原来的两倍。

 

void get_d(int n){d[1] = 1;for(int i = 2 ; i <= n ; i ++){if(!vis[i]){p[cnt++] = i;d[i] = 2;a[i] = 1;}for(int j = 0; p[j] * i <= n ; j ++){int m = p[j] * i;vis[m] = true;if(i % p[j] == 0){a[m] = a[i]+1;d[m] = d[i]/a[m]*(a[m]+1);break;}else{d[m] = 2*d[i];a[m] = 1;}   }}
}

  

线性筛代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1e6+10;int p[N] , vis[N] , cnt;
int a[N] ;
int d[N] ;void get_d(int n){d[1] = 1;for(int i = 2 ; i <= n ; i ++){if(!vis[i]){p[cnt++] = i;d[i] = 2;a[i] = 1;}for(int j = 0; p[j] * i <= n ; j ++){int m = p[j] * i;vis[m] = true;if(i % p[j] == 0){a[m] = a[i]+1;d[m] = d[i]/a[m]*(a[m]+1);break;}else{d[m] = 2*d[i];a[m] = 1;}   }}
}int main()
{int x ; cin>>x;get_d(x);cout<<d[x]<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1023441.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Canine IP-10/CXCL 10 ELISA试剂盒上新

科研用Canine IP-10/CXCL 10 ELISA试剂盒重磅来袭&#xff0c;将在免疫学、癌症研究与神经科学等多个领域助力各位老师们的研究&#xff01; 图1&#xff1a;犬IP-10/CXCL10结构预测&#xff08;图片来源&#xff1a;UniProt&#xff09; C-X-C基序趋化因子(C-X-C motif chemok…

【k8s网络】梳理cni发展脉络

参考 《深入剖析 Kubernetes&#xff08;张磊&#xff09;》 补充 详解 Calico 三种模式&#xff08;与 Fannel 网络对比学习&#xff09;_calico vxlan-CSDN博客 容器网络 容器的网络栈 每个容器有自己的 net namespace net namespace 可以称之为网络栈所谓“网络栈”&…

vue.js+element-ui的基础表单

遇到原生的html小型单页应用时&#xff0c;是脱离了vue框架&#xff0c;而我们又想使用vue的语法和element的组件加快我们的开发速度&#xff0c;这个时候就需要引用他们的js了。技术栈即htmlvue.jselement-ui。而使用它们的方法也很简单&#xff0c;引入对应的js和css文件即可…

智慧交通(代码实现案例)

1.项目简介 目标: 了解智慧交通项目的架构知道智慧交通项目中的模块能够完成智慧交通项目的环境搭建 该项目是智慧交通项目&#xff0c;通过该项目掌握计算机视觉的方法在交通领域的相关应用&#xff0c;包括车道线检测的方法&#xff0c;多目标车辆追踪及流量统计方法&#…

C#学习笔记3:Windows窗口计时器

今日继续我的C#学习之路&#xff0c;今日学习自己制作一个Windows窗口计时器程序&#xff1a; 文章提供源码解释、步骤操作、整体项目工程下载 完成后的效果大致如下&#xff1a;&#xff08;可选择秒数&#xff0c;有进度条&#xff0c;开始计时按钮等&#xff09; &#xf…

基于JavaSpringmvc+myabtis+html的鲜花商城系统设计和实现

基于JavaSpringmvcmyabtishtml的鲜花商城系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…

基于单片机的智能花盆设计

摘 要 本文设计了一种智能化的花盆控制系统。该系统采用STC89C51 单片机作为主控制器,通过温湿度传感器对植物生长环境进行检测,将采集的数据信号与系统数值进行比较,从而实现了智能花盆的自动或手动浇水功能。 关键词 智能花盆;STC89C51 单片机;温湿度检测 0 引言 随着…

使用postman调用Vcenter-Api

一、下载postman Postman API Platform 二、Vcenter-APi-文档 Create Session | CIS | vSphere CIS REST APIs 三、如何调用&#xff1f; 一、获取访问凭证 两种方式进行鉴权&#xff0c;这里讲第一种。 二、使用postman调用Api获取凭证 下面就是vmware-api-session-id …

Knowledge Graph Neural Network

利用知识图谱预测药物相互作用&#xff0c;代码&#xff1a;Knowledge Graph Neural Network&#xff0c;原文&#xff1a;KGNN: Knowledge Graph Neural Network for Drug-Drug Interaction Prediction&#xff0c;模型框架如下&#xff1a; 文章目录

2024/03/25(C++·day1)

一、思维导图 二、练习 练习一 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream&g…

【LeetCode热题100】543. 二叉树的直径(二叉树)

一.题目要求 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 二.题目难度 简单 三.输入样例 示例 1&#xff…

数据挖掘与分析学习笔记

一、Numpy NumPy&#xff08;Numerical Python&#xff09;是一种开源的Python库&#xff0c;专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一&#xff0c;因为它高效地实现了向量化计算&#xff0c;并提供了对大型多维数组和矩阵的支持…

BGP4+简介

定义 BGP是一种用于自治系统AS&#xff08;Autonomous System&#xff09;之间的动态路由协议&#xff0c;常用版本是BGP-4&#xff0c;BGP-4只能传递IPv4路由。针对IPv6的BGP4扩展&#xff0c;通常称为BGP4。 目的 BGP4用于在AS之间传递路由信息&#xff0c;并不是所有情况…

NFTScan | 03.18~03.24 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.03.18~ 2024.03.24 NFT Hot News 01/ NFT 系列 NodeMonkes 地板价已超越 BAYC 3 月 18 日&#xff0c;据数据显示&#xff0c;NFT 系列 NodeMonkes 地板价已超越 Bored Ape Yacht …

k8s浅聊一下Pod

Pod官网定义文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/ Pod是可以在k8s中创建和管理的、最小可部署的计算单元。 Pod是逻辑意义上的主机&#xff0c;Pod里面可以运行一个或者多个容器&#xff0c;Pod里面运行一个根容器pause&#xff0c;业…

鸿蒙实战开发:【国际化部件】

简介 国际化部件为应用提供了一系列国际化接口&#xff0c;包括&#xff1a;时间日期格式化、数字格式化、月份星期格式化、单复数、度量衡等相关接口。基于这些国际化接口&#xff0c;开发者可以设计并实现具有良好国际化能力的应用&#xff0c;从而可以高效、低成本的实现应…

短视频矩阵系统--技术实际开发打板3年真实开发分享

短视频矩阵系统--技术实际开发打板3年真实开发分享&#xff0c;短视频矩阵系统/矩阵获客系统是一种基于短视频平台的获客游戏。短视频矩阵系统可以通过多账号发布来替代传统的单账号游戏。可以一键发布所有账号&#xff0c;批量制作多个视频AI智能剪辑。过去很多人只能完成的工…

java算法第34天 | 贪心算法 part03 ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

1005.K次取反后最大化的数组和 思路&#xff1a; 先将数组元素从小到大排列&#xff0c;从左向右处理&#xff0c;分两种情况讨论 当遇到负数&#xff0c;将负数变为正数&#xff0c;继续处理下一个元素当遇到正数&#xff0c;对数组重排&#xff0c;循环处理当前的最小元素。…

ts js vue 验证文件 MD5 值 spark-md5

ts js vue 验证文件 MD5 值 spark-md5 如何在前端中验证要上传的文件的 md5 值 一、安装 spark-md5 插件 需要用到 spark-md5 这个插件 官方 github&#xff1a;https://github.com/satazor/js-spark-md5/tree/master yarn add spark-md5 // 或 npm i spark-md5使用的时候引…