埃式筛法尽管不错,但是确实做了许多无用功,某个数可能会被重复的筛好几次,欧拉筛解决了这个方法,下面为代码:
注意理解if(i%prim[j]==0) break;
大佬讲的不错的博客,我就不做复读机了。
点我传送

void ispirm(){int cnt=0;memset(visited,true,sizeof(visited));for(int i=2;i<=maxn;i++){if(visited[i]) prim[cnt++]=i;for(int j=0;j<cnt&&prim[j]*i<=maxn;j++){visited[prim[j]*i]=false;if(i%prim[j]==0) break;}}
}

学会了欧拉筛法的话,下面有个经典例题,查询某段区间内质数的个数
题目链接:点我传送
这里用前缀和处理一下就可以再O(1)的时间复杂度情况查出了。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e7;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
bool visited[maxn+10];
int prim[1000000+5];
int ans[maxn+10];
void ispirm(){int cnt=0;memset(visited,true,sizeof(visited));for(int i=2;i<=maxn;i++){if(visited[i]) prim[cnt++]=i;for(int j=0;j<cnt&&prim[j]*i<=maxn;j++){visited[prim[j]*i]=false;if(i%prim[j]==0) break;}}
}
int main()
{ispirm();int t;cin>>t;for(int i=2;i<=maxn;i++){ans[i]=ans[i-1]+visited[i];}while(t--){int x,y;scanf("%d%d",&x,&y);printf("%d\n",ans[y]-ans[x-1]);}return 0;
}

欧拉筛 筛法求素数 及其例题 时间复杂度O(n)相关推荐

  1. 欧拉线性筛法求素数(顺便实现欧拉函数的求值)

    标签:欧拉筛法   素数   欧拉函数   phi 我们先来看一下最经典的埃拉特斯特尼筛法.时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { ...

  2. spoj26246 Strange But Easy(欧拉筛选法求素数)

    用php提交超时,改为c++ #include <cstdio> #include <vector> #include <cstring>using namespa ...

  3. 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)

    素数 素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.如2 , 3 , 5 , 7 , 11等. 素数筛 素数筛即筛选出1~n内的素数的方法,这里介绍三种 常见的求素数 ...

  4. 素数筛法详解:埃氏筛和欧拉筛

    文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...

  5. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  6. 欧拉筛+埃式筛求素数

    参考:https://blog.csdn.net/nk_test/article/details/46242401 先看一下经典的埃拉特斯特尼筛法: 1 int prime[MAXN],vis[MAX ...

  7. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  8. 素数筛法(主要是欧拉筛)

    从2021.9.5日起,每天写1~2篇博客 埃氏筛法核心就是筛掉每一个素数的倍数,比方说2能筛4,6,8:但是有可能有重复,比如6可以被2,3筛掉.因此-->重点说的欧拉筛就有用了. void ...

  9. 数据结构与算法:欧拉筛——查找素数(质数)的最优解算法 O(n)

    前言:众所周知,查找素数是算法题中最基础的问题,也是经常被问到的问题.            但往往同学们找不到最优解法,因而导致 时间复杂度 过大而超出限制.            下面列出常用的求 ...

最新文章

  1. echart 圆饼图 显示单位_玩转ECharts之实现“1/2圆的玫瑰图”
  2. PHP执行批量mysql语句
  3. Path和ClassPath差异
  4. 安装win10的笔记本有10个地方需要微调
  5. 用科学计算机log21 p x,山东理工大学数据结构期末 试题及答案
  6. JS下载地图离线数据,前端下载谷歌离线地图
  7. 挖洞手记——软媒魔方可信任程序执行漏洞
  8. pdf文档动态插入水印,45度角,位于文档中央,可插入中文
  9. 【Fantastic-admin】Vue前端框架 出现v-model无法绑定,绑定之后页面无法加载
  10. C++二分查找相关函数用法总结
  11. 向日葵远控rce复现
  12. .net and oracle
  13. Python2 基础
  14. Windows10编译CPU版OpenPose
  15. 头歌--C++之函数进阶练习题
  16. 同济大学计算机考试题库,同济大学线性代数试卷题库 (1).doc
  17. 软件安全实验(一)PEVIEW-弹窗操作
  18. 山东的计算机大专排名2015年,山东十大专科学校排名2021 山东最好的高职院校
  19. java初级面试复习总结大全
  20. Redis由浅入深深深深深剖析

热门文章

  1. 变换为json类型却遭遇乱码\u516c\u5f00\u65e5\u671f
  2. ACMNO.41C语言-数字调序 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数
  3. 详解|工业机器人内部机构详解
  4. 如何量化医学图像分割中的置信度?
  5. xilinx LVDS使用注意事项
  6. 2014年:这些词都快被玩坏了
  7. C++泛型编程:template模板
  8. windows8.1与centos7.0双系统启动项设置
  9. android 循环平移动画
  10. setTimeOut() 和 setTimeInterval()