本题针对洛谷P3383 【模板】线性筛素数做的代码,讲解网上有很多,主要是自己存一下代码

#include <cstdio>
#define fi(i,l,r) for(int i=l;i<=r;++i)
#define fd(i,r,l) for(int i=r;i>=l;--i)using namespace std;
const int N=1e8+5;int n,m;
int x;
int prime[N],tot;
bool vis[N];template<typename T>void Read(T &x)
{x=0;T k=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') k=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}x*=k;
}
template<typename T>void Print(T x)
{if(x<0){putchar('-');Print(-x);}if(x>9) Print(x/10);putchar((x%10)^48);
}int main (void)
{//筛选1到n的素数,后回答m个询问 Read(n);Read(m);fi(i,2,n){if(!vis[i]) prime[++tot]=i;for(int j=1;j<=tot&&i<=n/prime[j];++j){vis[i*prime[j]]=true;if(i%prime[j]==0) break;}}while(m--){Read(x);Print(prime[x]);putchar(10);}return 0;
}

下面附上李煜东(蓝书的代码),结合实际分析,李煜东写的代码v数组是int型,使用的空间变大了,执行效率上并没有比上述版本更优,故推荐还是使用自己的版本。

#include <cstdio>
#define fi(i,l,r) for(int i=(l);i<=(r);++i)
#define fd(i,r,l) for(int i=r;i>=l;--i)using namespace std;
const int N=1e8+5;int n,m;
int x;
int prime[N],tot;
int v[N];template<typename T>void Read(T &x)
{x=0;T k=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') k=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}x*=k;
}
template<typename T>void Print(T x)
{if(x<0){putchar('-');Print(-x);}if(x>9) Print(x/10);putchar((x%10)^48);
}int main (void)
{//筛选1到n的素数,后回答m个询问 Read(n);Read(m);fi(i,2,n){if(!v[i]) {prime[++tot]=i;v[i]=i;} fi(j,1,tot){if(prime[j]>v[i]||prime[j]>n/i) break;v[i*prime[j]]=prime[j];}}while(m--){Read(x);Print(prime[x]);putchar(10);}return 0;
}

关于李煜东版本的代码可能有的读者不太在意,我们可以用他的版本写P3912 素数个数试试,代码如下:

#include <cstdio>
#define fi(i,l,r) for(int i=(l);i<=(r);++i)
#define fd(i,r,l) for(int i=r;i>=l;--i)using namespace std;
const int N=1e8+5;int n,m;
int x;
int prime[N],tot;
int v[N];template<typename T>void Read(T &x)
{x=0;T k=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') k=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}x*=k;
}
template<typename T>void Print(T x)
{if(x<0){putchar('-');Print(-x);}if(x>9) Print(x/10);putchar((x%10)^48);
}int main (void)
{//筛选1到n的素数,后回答m个询问 Read(n);fi(i,2,n){if(!v[i]) {prime[++tot]=i;v[i]=i;} fi(j,1,tot){if(prime[j]>v[i]||prime[j]>n/i) break;v[i*prime[j]]=prime[j];}}Print(tot);putchar(10);return 0;
}

读者提交之后应该会收获如下评测结果:

上述测试结果表明李煜东版本的线性筛v数组使用int型对空间要求确实高,因此从实用性的角度,推荐读者使用最上面那个版本的素数筛,vis数组是bool类型的,省了一部分空间。

下面是这个版本的评测结果,虽然空间也很大但112MB的空间大致能满足很多算法竞赛的需求了。

C++语言,线性素数筛(欧拉筛)相关推荐

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

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

  2. 埃氏筛 线性筛(欧拉筛) 算法解析

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

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

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

  4. 素数筛选法(埃氏筛 欧拉筛)

    质数筛选法 文章目录 质数筛选法 前言 一.埃氏筛 O(nloglogn)O(nloglogn)O(nloglogn) 二.欧拉筛O(n)O(n)O(n) 总结 前言 当需要大范围内的素数时,例如1e ...

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

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

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

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

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

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

  8. 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )

    整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn​)) ②求[1,n]之间每个数的质因数 ...

  9. 埃氏筛与欧拉筛(线性筛)

    目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...

  10. 筛选质数,埃氏筛和欧拉筛(线性筛)

    求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...

最新文章

  1. Failed to resolve:com.android.support:appcompat-v7:27.+
  2. TextField输入结束后让键盘消失的两个技巧
  3. 项目管理如何有效进行
  4. Android开发环境——Eclipse ADT相关内容汇总
  5. eclipse的tomcat插件使用下载(转)
  6. Serverless的4种错误打开方式
  7. java feign同时传对象和其他参数_关于Spirng Cloud的Feign传参问题:
  8. 关于公司没有公网IP也没有动态IP,如何远程办公呢?
  9. rtp 实时传输协议
  10. Flume将A服务器上的日志实时采集到B服务器
  11. AsyncTask源代码解析
  12. 苹果手用计算机解锁手机密码,苹果手机怎么强制解锁 iPhone强制解锁密码教程...
  13. win32asm写的红警98修改器
  14. Fractional Fourier Image Transformer forMultimodal Remote Sensing Data Classification
  15. sql server 经典练习题分享二
  16. python计算机视觉——立体匹配与NCC算法
  17. 免费学习coursera的课程的操作办法
  18. C语言:程序设计综合训练
  19. 矩阵的Jordan分解实例
  20. ros构建机器人运动学模型_ROS机器人底盘(4)-3D仿真模型

热门文章

  1. 上下文无关文法(CFG)
  2. 对话改写论文笔记(2021年初 )
  3. Origin 2022安装教程(附下载链接)
  4. Android WebView使用详解
  5. 【QGIS】shp文件下载
  6. RANSAC算法拟合平面实现
  7. 直播电商系统源码 直播系统源码
  8. Python遍历文件夹下所有文件及目录
  9. linux bzip2 命令,Linux bzip2 命令的使用
  10. 全网搜歌神器Listen1 Mac中文版