C++语言,线性素数筛(欧拉筛)
本题针对洛谷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++语言,线性素数筛(欧拉筛)相关推荐
- 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 线性筛素数(欧拉筛)
欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...
- 素数筛选法(埃氏筛 欧拉筛)
质数筛选法 文章目录 质数筛选法 前言 一.埃氏筛 O(nloglogn)O(nloglogn)O(nloglogn) 二.欧拉筛O(n)O(n)O(n) 总结 前言 当需要大范围内的素数时,例如1e ...
- 欧拉筛+埃式筛求素数
参考:https://blog.csdn.net/nk_test/article/details/46242401 先看一下经典的埃拉特斯特尼筛法: 1 int prime[MAXN],vis[MAX ...
- 素数筛法详解:埃氏筛和欧拉筛
文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...
- 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)
素数 素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.如2 , 3 , 5 , 7 , 11等. 素数筛 素数筛即筛选出1~n内的素数的方法,这里介绍三种 常见的求素数 ...
- 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )
整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn)) ②求[1,n]之间每个数的质因数 ...
- 埃氏筛与欧拉筛(线性筛)
目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...
- 筛选质数,埃氏筛和欧拉筛(线性筛)
求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...
最新文章
- Failed to resolve:com.android.support:appcompat-v7:27.+
- TextField输入结束后让键盘消失的两个技巧
- 项目管理如何有效进行
- Android开发环境——Eclipse ADT相关内容汇总
- eclipse的tomcat插件使用下载(转)
- Serverless的4种错误打开方式
- java feign同时传对象和其他参数_关于Spirng Cloud的Feign传参问题:
- 关于公司没有公网IP也没有动态IP,如何远程办公呢?
- rtp 实时传输协议
- Flume将A服务器上的日志实时采集到B服务器
- AsyncTask源代码解析
- 苹果手用计算机解锁手机密码,苹果手机怎么强制解锁 iPhone强制解锁密码教程...
- win32asm写的红警98修改器
- Fractional Fourier Image Transformer forMultimodal Remote Sensing Data Classification
- sql server 经典练习题分享二
- python计算机视觉——立体匹配与NCC算法
- 免费学习coursera的课程的操作办法
- C语言:程序设计综合训练
- 矩阵的Jordan分解实例
- ros构建机器人运动学模型_ROS机器人底盘(4)-3D仿真模型