欧拉线性筛 求n的最小正因数的个数
由算术基本定理可得:
任何一个大于1的N的自然数,如果N不为质数,可以被分解成有限个质数的乘机,即 n=(p1a1)*(p2a2)(p3a3)*……*(pnan),在这里(p1<p2<p3<……<pn)pi为质数,ai为正整数。
所以n的正因数的个数为(a1+1)(a2+2)……(an+1)。
这里为什么时各个质因数的指数加上1呢?
因为在组成n的因数的时候我们可以选择将该质因数取0,1,2……ai个,所以质因数pi对于n的因数的个数的贡献是(ai+1)。例如:12=(22)*(31),当3取0个时,2可以取0个,1个,2个即12的正因数为1,2,4(个数为3),同理当3取1个时,2可以取0,1,2个,即12的正因数为3,6,12(个数为3),所以就是(2+1)*(1+1)=6。
欧拉线性筛保证每个数只会取到一次,所以时间复杂度为O(n)
int pre[maxn],vis[maxn],prime[maxn],fac[maxn]; //pre为最小因数出现的个数,vis为该数是否已经出现过,prime保存的时质数int cnt=0;fac[1]=1;for(int i=2;i<maxn;i++){if(!vis[i]) prime[cnt++]=i,pre[i]=1,fac[i]=2; //当i为质数时,i出现的次数为1,质数的正因素的个数为2,1和他自己for(int j=0;j<cnt&&i*prime[j]<maxn;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){ pre[i*prime[j]] = pre[i]+1; //i*prime[j]中prime[j]出现的次数为i中prime[j]出现的个数加1fac[i*prime[j]]=fac[i]/(pre[i]+1)*(pre[i*prime[j]]+1); //i*prime[j]中的正因数出现的个数需要去掉prime[j]对于i的贡献,再乘上i*prime[j]中的最小质数的个数+1。}pre[i*prime[j]]=1; //prime[j]出现的次数为1fac[i*prime[j]]=(pre[i*prime[j]]+1)*fac[i];}}
欧拉线性筛 求n的最小正因数的个数相关推荐
- 欧拉线性筛 与 欧拉函数 + 几道例题
欧拉线性筛 生成素数表prime[]数组 const int maxn = 1e7+5; int prime[maxn]; int visit[maxn]; void Prime(){memset(v ...
- 洛谷 - P1217 [USACO1.5]回文质数 Prime Palindromes(欧拉线性筛+数论小知识)
题目链接:点击查看 题目大意:给出一个a和b,求出区间[a,b]中所有回文质数,回文质数指的是一个数既是回文数也是质数 题目分析:首先质数好判断,我们只需要用欧拉筛预处理打好表即可,判断回文数我们也只 ...
- 牛客 - lglg说要有题,于是便有了题。(欧拉线性筛+打表+思维)
题目链接:点击查看 题目大意:给出公式,代表第i个素数,现在给出n,求出答案,对于答案保留整数 题目分析:这个题目因为涉及到了素数,先用欧拉线性筛打个素数表再说,打完了然后分析一下时间复杂度,给出的样 ...
- 牛客3007E-立方数-欧拉线性筛+素数分解+二分
链接:https://ac.nowcoder.com/acm/contest/3007/E 来源:牛客网 题目描述: 对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 A3B=N 输 ...
- 欧拉(线性)筛 Miller_Rabin 测试素数
void make_prime()//欧拉筛 {is_prime[1]=is_prime[0]=true;for(int i=2;i<=1e6;i++){if(!is_prime[i]){pri ...
- 欧拉线性筛法求素数(顺便实现欧拉函数的求值)
标签:欧拉筛法 素数 欧拉函数 phi 我们先来看一下最经典的埃拉特斯特尼筛法.时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { ...
- ACM-ICPC 2018 南京赛区网络预赛 J Sum(欧拉线性筛+思维)
Sum 问题分析 题意:我们将类似于6=2⋅36=2⋅36 = 2\cdot 3这样的数称为asquare−freeintegerasquare−freeintegera\:square-free\: ...
- 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)
[目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...
- 线性筛求莫比乌斯函数前缀和
大家知道有一类问题,让你把1~N之间每一个数的莫比乌斯函数都输出来,或者把它们全部加起来再输出.这种问题应该属于求前缀和一类的啦 用正规的方式表达: 就论求1~N间每个数的莫比乌斯函数吧.我们一般使用 ...
最新文章
- Python设计模式-装饰器模式
- P1102 A-B 数对(二分,映射)难度⭐
- Angel:深度学习在腾讯广告推荐系统中的实践
- mui用ajax上拉加载更多,mui上拉加载更多的使用
- html编辑器linux,HTML 编辑器
- 微软AirSim,一个无人机和机器人的模拟器
- Highcharts隐藏网格线
- SpringBoot入门到精通_第6篇 _必知必会
- ip地址理解 192.168.19.255/20
- 190303每日一句
- SQLyog使用教程
- 【开源】3串锂电池充放电保护板设计参考
- (一)Word中如何将表格断开,并且增加空的一行
- pycharm: Error: Cannot run program……
- GreatSQL配置到系统systemd服务
- 嵌入式硬件Linux,嵌入式linux硬件什么要求
- 发送打印命令后打印机没反应,重启打印机之后才能打印
- python 往mysql数据库存储照片
- 常见的网络接口解释(E1、FE、GE、10GE、POTS)
- java vb 速度_使用VB.NET加快代码开发速度