埃氏筛法的一般写法(区间筛法)
问题:
求 $[L, R]$ 之间的素数表
解法:
一个合数 $n$ 的最小素因子不超过 $\sqrt{n}$。
先用埃氏筛法求出 $[1,\lfloor \sqrt{R} \rfloor]$ 上的素数表
再在 $[L, R]$ 上用埃氏筛法求素数
const int N(1e5); bool isprime[N]; int prime[N]; void init(){memset(isprime, -1, sizeof(isprime));isprime[0]=isprime[1]=0;int np=0;for(int i=0; i<N; i++){if(isprime[i]){prime[np++]=i;for(int j=2*i; j<N; j+=i)isprime[j]=0;}} } typedef long long ll; const int M(1e5); bool ok[M]; int res[M]; int seive(ll l, ll r){ // l, r >=1memset(ok, -1, sizeof(ok));if(l==1) ok[0]=0; //error-proneint k=sqrt(r);for(int i=0; prime[i]<=k; i++){ll j=(l+prime[i]-1)/prime*prime;j=max(j, (ll)2*prime[i]);for(; j<=r; j+=prime[i])ok[j-l]=0;}int np=0;for(int i=0; i<=r-l; i++)if(ok[i]) res[np++]=i+(ll)l;return np; }
更新:
不必先把 $[2, \lfloor \sqrt{R} \rfloor]$ 上的素数存下来。更好的做法是先分别做好 $[2, \lfloor \sqrt{R} \rfloor]$ 和 $[L, R]$ 的表,然后从 $[2, \lfloor \sqrt{R} \rfloor]$ 的表中筛得素数的同时,也将其倍数从 $[L, R]$ 中划去。
const int N=1e6+5, M=sqrt(1e9);bool is_prime[N]; bool is_prime_small[M+1];void segment_seive(int l, int r){ // [l,r]int t=sqrt(r);for(int i=2; i<=t; i++)is_prime_small[i]=true;for(int i=0; i<=r-l; i++)is_prime[i]=true;for(int i=2; i<=t; i++)if(is_prime_small[i]){for(int j=2*i; j<=t; j+=i)is_prime_small[j]=false;for(int j=max(2, (l+i-1)/i)*i; j<=r; j+=i)is_prime[j-l]=false;} }
转载于:https://www.cnblogs.com/Patt/p/4805212.html
埃氏筛法的一般写法(区间筛法)相关推荐
- java 埃氏筛法_筛法
素数与最大公因子2021-02-12 17:32:04 素数 定义: 素数是大于 \(1\) 的正整数, 并且除了 \(1\) 和它本身外不能被其他正整数整除. 素数的数量: 不超过 \(N\) 的素 ...
- 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 【算法分析与设计】埃氏筛素数算法
文章目录 素数 埃氏筛 算法思想 时间复杂度 Java编程实现 算法优化 素数 素数也称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 最基本的质数:2, 3, 5, 7, ...
- 埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 素数筛法详解:埃氏筛和欧拉筛
文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...
- 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)
一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题). 二.埃氏筛法(Eratosthenes筛法) 埃氏筛法又叫做Eratosthenes筛法 ...
- 素数基本(埃氏筛法/线性筛法)
一.检查n是否为素数 最简单思路:所有可能的因数全部试一遍. int gg(int n) {for(int i=2;i<n;i++){if((n%i)==0)return 0;//有因数就不是素 ...
- 进阶必备:素数筛法(欧拉,埃氏筛法)
筛选素数其实有两种比较高效的算法可以提供选用,分别是:Eratosthenes筛选法与欧拉筛选法.但是欧拉算法的普适性比较高,所以这里就只介绍欧拉函数的算法. 筛选的范围较小的话,欧拉算法,数据较大, ...
- 素数计算之埃氏筛法、欧拉筛法
埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...
最新文章
- ssh项目实战----Spring计时器任务 Spring整合JavaMail(邮件发送)
- Java输出彩色字符
- [转载] 百科全说——栾加芹:你适合这些食物吗?(11-03-07)
- FarPoint Spread For .Net 4.0
- 使用计算机控制台方法,故障控制台使用方法
- 九、索引与执行计划、索引的分类
- mysql for macOS安装
- CF(427D-Match amp; Catch)后缀数组应用
- java文件上传判重姿势浅谈
- LM393实现简易PWM调压电路
- Amos中介效应检验
- virtualbox安装步骤
- 福利!H3CNE认证网络工程师GB0-191 考试试题库超详细解析-02。持续更新~~
- nginx 配置为play!的前端http服务器
- 2路继电器控制直流电机正反转问题
- c语言综合合计实验报告,C语言设计实验报告(第一次)
- 前端模型--css动画(旋转八音盒)
- java 文件拷贝保留原来的属性_Java常用属性拷贝工具类使用总结
- codeforces 1326 E.Bombs
- 把全角数字(及字母)转换成半角数字
热门文章
- 【音视频安卓开发 (五)】Android中获取音视频原始数据的方法
- C 的 3种内存顺序,你都知道吗?
- 巧解C语言运算符的优先级和结合性
- go odroid_小众奇葩!Odroid Go Super简评
- go环境搭建_学习的golang第一步,搭建我们运行的环境,go! go! go
- hadoop源码分析_Spark2.x精通:Job触发流程源码深度剖析(一)
- 手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...
- C++11新特性之智能指针
- 串口服务器的通讯模式
- 视频监控中的光端机是干什么用的?