线性筛法 与 线性求欧拉函数 的计算模板
简介
懂得如何快速计算质数是十分重要的
在筛法的基础上,我们可以使用更为高级的线性筛法!
顾名思义,就是时间复杂度是线性的,即 O(N)O(N) ,N 为所求的质数范围
而对编程有所接触的人,应该都知道欧拉函数 即 φ(N)φ(N)
听起来高大上,其实就表示 小于等于 N 的数中与 N 互质的数的数目
这在竞赛中用处很大,变式也很多—— ~不明觉厉~
那么如何在 线性时间 内求出 1—N1—N 中的 质数表 和 欧拉函数表 呢?
下面给出两个算法的模板——
线性筛法
这个算法的本质就是在筛法的基础上,加上一个不再重复筛的退出语句
模板如下:
for(int i=2;i<=N;i++)
{if(!bz[i]) f[++f[0]]=i;for(int j=1;j<=f[0] && i*f[j]<=N;j++){bz[i*f[j]]=true;if(i%f[j]==0) break;//极大优化!}
}
- 注释:标志数组为 bz[N]bz[N] , 质数表为 f[N]f[N] 。
线性求欧拉函数
这个算法的本质就是在筛法的基础上,根据欧拉函数的积性性质来处理
模板如下:
for(int i=2;i<=N;i++)
{if(!bz[i]) phi[f[++f[0]]=i]=i-1;for(int j=1;j<=f[0] && i*f[j]<=N;j++){bz[i*f[j]]=true;if(i%f[j]==0)//同样的极大优化!{phi[i*f[j]]=phi[i]*f[j];break;}else phi[i*f[j]]=phi[i]*(f[j]-1);//欧拉函数的积性性质}
}
- 注释:标志数组为 bz[N]bz[N] , 质数表为 f[N]f[N] , 欧拉函数表为 phi[N]phi[N] 。
总结
这两个算法有两个优点:
短小精悍
复杂度线性,O(N)O(N) 处理
所以在以后的学习中,应熟练掌握这两种算法!
线性筛法 与 线性求欧拉函数 的计算模板相关推荐
- ~~筛法求欧拉函数(附模板题)
模板 int primes[N], cnt; // primes[]存储所有素数 int euler[N]; // 存储每个数的欧拉函数 bool st[N]; // st[x]存储x是否被筛掉voi ...
- ~~求欧拉函数(附模板题)
模板 int phi(int x) {int res = x;for (int i = 2; i <= x / i; i ++ )if (x % i == 0){res = res / i * ...
- AcWing 874. 筛法求欧拉函数(线性筛法求欧拉函数模板)
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和. 数据范围 1≤n≤10^6 输入 ...
- 【模板题】欧拉函数与线性筛求欧拉函数
欧拉函数是什么? 定义:对于正整数nnn,欧拉函数是小于或等于nnn的正整数中与nnn互质的数的个数,记作φ(n)\varphi (n)φ(n). φ(1)=1\varphi (1)=1φ(1)=1. ...
- 874. 筛法求欧拉函数
874. 筛法求欧拉函数 题目 代码 题目 给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉 ...
- AcWing 874. 筛法求欧拉函数
线性筛法求解欧拉函数 有关线性筛法的介绍,可以参考这道题:868. 筛质数 - AcWing题库 这道题y总采用了线性筛选法来筛选掉指定范围内的合数,筛选出质数.思维利用得极为巧妙. 结合y总讲解视频 ...
- 如何求欧拉函数~转载
三.欧拉函数 请思考以下问题: 任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?) 计算这个值的方法就叫做欧拉函数,以φ(n ...
- hdu2824(2009多校第一场) 线性筛法求欧拉函数
欧拉函数指小于n且与其互质的数个数: phin=n*(1-1/p1)*(1-1/p2)*...(1-1/pn) 由此便可以利用类似筛素数筛出所有欧拉函数,具体看代码: 1 #include<st ...
- AcWing 874. 筛法求欧拉函数(欧拉函数)
题目链接 https://www.acwing.com/problem/content/876/ 思路 对于一个数x如果是质数,那么它的欧拉函数就为x−1x-1x−1,对于其他合数我们可以将其拆成最小 ...
最新文章
- 几十年的领域专家告诉你,机器翻译进化到哪一步了?
- XPath学习:轴(13)——namespace
- Web前端求职时都会被问到的Redis面试题分享
- JAVA-循环体小练习——ATM取款机
- python实战,教你用微信每天给女朋友说晚安
- USACO Training Section 1.2 双重回文数 Dual Palindrom
- 用Java解决生产者-消费者问题
- 输出空格隔开换行_【前端干货】CSS 的空格处理
- Java学习笔记2.3.4 运算符与表达式 - 逻辑运算符
- 客服系统微服务架构的演化
- gitlab简单使用教程【转】
- vue的$message(提示框换行)
- 传染病模型中作图与计算(matlab,数学模型)
- html中三角函数表示什么,三角函数a怎么求
- 浅谈在制造业中建设MES系统的成效
- ECSHOP模板堂商品最小起订量插件
- 换挡周期下,谁将成为厨电品牌的进取者?
- 电脑与云服务器的区别吗,云服务器和普通电脑有什么不同区别?
- 为FireFox增加自定义搜索引擎
- Java面试:java小项目实例