情境

大家应该都知道用nlogn的时间复杂度筛出[1,n]的所有素数,但是当n的范围较大时,这个方法就不奏效了
今天我们谈谈素数的线性筛法,也就是用On的时间复杂度筛出[1,n]的所有素数

解析

nlog的算法之所以会慢,是因为它进行了很多重复的操作
比如,24可能就被筛了很多遍
那么我们优化复杂度的思路就是尝试避免这些重复操作
也就是让每个合数只被筛一次
怎么做呢?
我们让每个合数只会被自己的最小质因数筛到
先看一下代码:

代码

void solve(){for(int i=2;i<=n;i++){if(v[i]==0){//还没被筛到就是素数了prime[++tot]=i;v[i]=i;}for(int j=1;j<=tot;j++){ll now=prime[j];if(now>v[i]||now*i>n) break;//now*i>n就是超出范围了,显然也不要了v[now*i]=now;}}return;
}

其中:

v[i]数组表示i的最小质因数
prime是素数表

代码是怎么做的?
枚举每一个数,再枚举已有的素数,只要当前素数还不大于自己的最小质因数,就一直用它筛
这个算法可以说是:

巧夺天工

为什么这样是对的呢?
接下来我们来证明一下这么做为什么就能不重不漏的筛出所有素数

证明

我们要证明两部分:不重、不漏

不漏

会不会少筛一些合数?
假设有一个合数a,那么它一定有一个不等于它本身的最小质因数
也就是说,存在:

a=v*k(v为质数且v<k)

显然v不会大于k的最小质因数,否则k的那个最小质因数就也是a的最小质因数了
那么我们在代码中循环枚举到k时,显然就会用质数表中已经有的v把a筛出来

不重

考虑反证法
假设代码过程中存在i与素数now,使得:

now*i=a;

且a的最小的质因数比i还小
不妨还设这个最小质因数为v
由于now已经是素数,所以这个v一定是i的一个因数
也就是说i存在一个质因数且小于now
那么now就一定比i的最小质因数大了
就会在前面的判断中break出去
证毕

线性筛素数的实现与证明相关推荐

  1. [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...

  2. 普及组模板——线性筛素数

    题目:[模板]线性筛素数(洛谷_3383) #include<iostream> #include<cstdio> #include<algorithm> #inc ...

  3. P3383 【模板】线性筛素数

    https://www.luogu.com.cn/problem/P3383 //线性筛法 /* P3383 [模板]线性筛素数 https://www.luogu.com.cn/problem/P3 ...

  4. 牛客3007E-立方数-欧拉线性筛+素数分解+二分

    链接:https://ac.nowcoder.com/acm/contest/3007/E 来源:牛客网 题目描述: 对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 A3B=N 输 ...

  5. 线性筛素数(欧拉筛)

    欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...

  6. 【线性筛】线性筛素数

    小目录 链接 题目描述 思路 代码 链接 YbtOJ6-2-1 题目描述 给定一个范围,有 q个询问,每次输出第 k 小的素数. 思路 欧拉筛 代码 #include<iostream> ...

  7. 洛谷 P3383 【模板】线性筛素数

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...

  8. 【Luogu3383】【模板】线性筛素数

    problem 给定一个范围N 回答M个某数字是否为质数的询问(M solution codes #include<iostream> #define maxn 10000010 usin ...

  9. 线性筛法 欧拉筛c语言,[洛谷P3383][模板]线性筛素数-欧拉筛法

    Hibernate Hql 总结 1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, ...

最新文章

  1. 从系统的启动过程分析,为什么我们划分分区的时候 /sbin 、/bin、/lib、/dev不能做为独立的分区?...
  2. php取结果集,php获取数据库结果集方法(推荐)
  3. windbg-内存破坏实例分析
  4. python自动化可以做什么菜_Python自动化开发学习之三级菜单制作
  5. OCS2007R2升级LyncSrv2013 PART1:基础准备
  6. 使用Pycharm安装numpy库
  7. SecureCRT的安装破解
  8. 组合测试法是什么 软件测试,组合测试模型方法
  9. python3 数独解法 深度遍历
  10. 如何才能达到超光速?
  11. 无执照开通微信商家收款码0.38%费率——步骤详细图解。
  12. DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告
  13. 基于proteus的功率_学习电路仿真:基于proteus电路仿真软件的步进电机仿真
  14. glusterfs架构和原理
  15. 浅谈sPLS和sgPLS
  16. 【BZOJ4833】最小公倍佩尔数(min-max容斥)
  17. 新高考没有选物理可以学计算机专业吗,高考选科是不是物理特别重要?新高考没有选物理是不是完了?...
  18. ISO9001、ISO9002、ISO9003和ISO9004有什么不同
  19. 使用模板快速制作H5网页(仅供参考)
  20. python 替换换行符_python按行读取文件,如何去掉换行符\\n

热门文章

  1. 两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段
  2. linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...
  3. a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版 | 学步园
  4. 筛选装置用c语言编程,一种空壳瓜子筛选装置的制作方法
  5. 10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下
  6. formula 返回list_python正则实现计算器功能
  7. js 上下箭头滚动_JS中的this完全讲解,再也不会被this搞晕了
  8. Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
  9. 完美国际真数苹果_如果给你推荐一款很贵,但好用的苹果手机壳,你会买吗?...
  10. 双路服务器只显示一半内存,双路服务器只显示一半内存