【题目链接】

ybt 2040:【例5.7】筛选法找质数

【题目考点】

1. 普通筛法找质数(埃拉托色尼筛法)

基本思想:把从2到N的一组正整数从小到大按顺序排列。从中依次删除2的倍数、3的倍数、5的倍数,直到N\sqrt{N}N​的倍数为止,剩余的即为2~N之间的所有质数。
普通筛法复杂度为:O(nloglogn)O(nloglogn)O(nloglogn)

为什么直到N\sqrt{N}N​的倍数为止,以下是证明:

  • 命题:对于整数n满足N<n≤N\sqrt{N} < n \le NN​<n≤N,n是质数,或n是合数时,存在一个整数a满足a≤Na \le \sqrt{N}a≤N​,a是n的因数。
  • 证明:显然n可以是质数。如果n是合数,使用反证法。
  • 假设n是合数时,n的因数(除了1)都大于N\sqrt{N}N​。由于n是合数,n至少有两个不为1或n的因数,设为a,b,且存在等式a⋅b⋅x=na\cdot b\cdot x = na⋅b⋅x=n,其中x是某个正整数。
    有a>N,b>N⇒a⋅b>N≥na>\sqrt{N}, b>\sqrt{N} \Rightarrow a\cdot b >N\ge na>N​,b>N​⇒a⋅b>N≥n,即a⋅b>na\cdot b > na⋅b>n
    根据a⋅b⋅x=na\cdot b\cdot x = na⋅b⋅x=n,有a⋅b≤na\cdot b \le na⋅b≤n
    出现矛盾,因而假设不成立,原命题得证。

2. 线性筛(欧拉筛)

基本思想:让每个合数只通过它最小的质因数被筛掉。

例:
8的最小质因数是2,那么让合数8通过质数2被筛掉。
15的最小质因数是3,那么让合数15通过质数3被筛掉。

普通筛法中,数字可能会被多次筛掉,线性筛中,每个数字只被筛掉一次。
线性筛法复杂度为:O(n)O(n)O(n)
线性筛的字面意思就是该算法的复杂度为线性的。

例:对于合数15
在普通筛法中:看质数3的倍数时,15被筛掉一次,看质数5的倍数时,15被筛掉一次。
在线性筛中: 15只会通过质数3被筛掉一次。

线性筛法中,维护一个质数数组prime[]。
算法如下:

  • 每次循环观察一个数字i
  • 如果i是质数,加入质数数组
  • 无论i是不是质数,都顺序遍历质数数组,取到的质数为prime[j]
    • 只要i不是prime[j]的倍数,那么prime[j]就是i*prime[j]的最小质因数。i*prime[j]这个合数通过prime[j]这个最小质因数被筛掉了。
    • 如果i是prime[j]的倍数,则跳出循环

原理解释如下:

  • 由于prime数组中的质数是递增的,在遍历prime数组的过程中,只要没有遇到i是prime[j]的倍数的情况,那么prime[j]一定是i*prime[j]的最小质因数。当第一次遇到i是prime[j]的倍数的情况时,prime[j]仍然是i*prime[j]的最小质因数。
  • 如果继续看prime[j]后面第x个质数(x大于等于1),此时要判断数字Y=i*prime[j+x]是否要被筛掉。由于prime[j+x] > prime[j],i已经具有更小的质因数prime[j],所以数字Y的最小质因数是prime[j]而不是prime[j+x],所以Y这个数不应该在i为这个值时被筛掉,它应该在i为Y/prime[j]时被筛掉。

例:假设i是25。25不是2的倍数,那么2是2*25的最小质因数,25也不是3的倍数,那么3是3*25的最小质因数,25是5的倍数,5仍然是5*25的最小质因数。
25不是7的倍数,7不是7*25的最小质因数了。7*25=175被筛掉的时机是:当i循环到35时,175=35*5,5是175的最小质因数,175通过质数5被筛掉。

【题解代码】

解法1:普通筛法(埃拉托色尼筛法)

#include<bits/stdc++.h>
using namespace std;
int main()
{bool isPrime[1005] = {};//isPrime[i]:i是否是质数 int n;cin >> n;for(int i = 2; i <= n; ++i)//初值状态下,把每个数字都标记为质数 isPrime[i] = true;//isPrime[0],与isPrime[1]都为false,0,1都不是质数 for(int i = 2; i <= int(sqrt(n)); ++i){if(isPrime[i]){for(int j = 2*i; j <= n; j += i)//如果一个数字是某质数的倍数,那么把它标记为合数 isPrime[j] = false;}}for(int i = 2; i <= n; ++i){if(isPrime[i])cout << i << endl;}return 0;
}

解法2:线性筛(欧拉筛)

#include<bits/stdc++.h>
using namespace std;
int main()
{bool isPrime[1005] = {};//isPrime[i]:i是否是质数 int n, prime[1005], psize = 0;//prime:质数数组 psize:prime数组长度 cin >> n;for(int i = 2; i <= n; ++i)//初值状态下,把每个数字都标记为质数 isPrime[i] = true;//isPrime[0],与isPrime[1]都为false,0,1都不是质数 for(int i = 2; i <= n; ++i){if(isPrime[i])//如果i是质数 prime[++psize] = i;//将i填充到指数数组prime for(int j = 1; j <= psize && i*prime[j] <= n; ++j)//遍历质数数组 {//筛去当前观察的数i与某质数prime[j]的乘积isPrime[i*prime[j]] = false;//i*prime[j]这个数通过prime[j]筛掉 if(i%prime[j] == 0)break;}}for(int i = 2; i <= n; ++i){if(isPrime[i])cout << i << endl;}return 0;
}

信息学奥赛一本通 2040:【例5.7】筛选法找质数 (普通筛 线性筛)相关推荐

  1. 信息学奥赛一本通(2040:【例5.7】筛选法找质数)

    2040:[例5.7]筛选法找质数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 490     通过数: 335 [题目描述] 用筛法求出n(2≤n≤1000) ...

  2. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  3. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  4. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  5. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  6. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  7. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  8. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  9. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

最新文章

  1. STM8S103 PB4和PB5
  2. react动态改变选中不选中_当使用react hooks选中任何复选框时,如何使启用按钮起作用?...
  3. 关系数据库——并发控制
  4. 51单片机基本刷屏测试实验_51单片机开发基础8——实时时钟实验
  5. GCD之线程挂起与恢复
  6. 计算机管理 网络延时打开,如何解决网络延时-如何解决局域网访问延迟问题?通过局域网访问网内机子,有时候半天没 爱问知识人...
  7. java菜鸟教程+视频笔记
  8. Exif的Orientation信息说明
  9. awb数据怎么计算_自动白平衡(AWB)算法
  10. 计算机二级wps office考试题库,计算机等级考试题库:WPS Office试题
  11. 智慧城市 宠物管理系统的重要性 --“遛狗不牵绳-违法”
  12. Python函数返回多个值的方法
  13. 简单的使用css画勾、叉、三角、大于号
  14. Resid------set
  15. 计算机网络技术网络建设小结,计算机网络精品课程建设总结报告.doc
  16. html页面解析 成dom树,将网页解析成dom树的几种方法
  17. 天泉湖酒店式养生社区服务中心漏电火灾监控系统的设计与应用
  18. com/fasterxml/classmate/TypeResolver
  19. 服务器ssl证书副本,SSL证书服务器名称是如何解析的/我可以使用keytools添加其他名称吗?...
  20. JQuery Mobile 样式刷新

热门文章

  1. Java基础之扩展GUI——高亮元素、上下文菜单、移动旋转元素、自定义颜色(Sketcher 10)...
  2. IBM 2013策略发布:大数据和分析、云计算、企业移动、社交商务、智慧商务、智慧城市...
  3. System.DBNull.Value与Null的区别
  4. .Net的类型构造器-static构造函数
  5. FreeRTOS调度器挂起与解除
  6. 面试官:Netty的线程模型可不是Reactor这么简单
  7. 成就架构师,到底是怎样的一种体验?
  8. 图解 Kafka,看本篇就足够啦
  9. 阿里巴巴闲鱼架构负责人王树彬:万亿交易规模技术架构实践
  10. JimuReport积木报表 — SQL数据源报表带参展示