素数线性筛(O(N)!!!)
2017-05-26 17:57
183 查看
我们先来看一下最经典的埃拉特斯特尼筛法。时间复杂度为O(n loglog n)
通过观察我们可以发现一个问题,这种方法会重复筛除合数,影响了效率。
比如,当30,在2*15筛了一次,在5*6又筛了一次。
所以我们有了一个快速线性筛法,不会重复筛选同一个数,所以几乎是线性的。
首先我们要知道一个条件
任何一个合数都可以表示成一连串质数的乘积
每个合数有一个最小的质因子,用这个质因子筛去这个合数,这样时间就是线性的了。
至于实现,先来看下代码
刚刚说的让合数被它最小的质因数筛去在代码中的体现就是这句:
if(!(i%prime[j]))
break;
由于枚举是从小到大的,所以prime数组中的质数是递增的
如果i%prime[j]为零(即i为prime[j]的倍数)
那么i*prime[j+1]这个合数一定已经被prime[j] 乘以某个数筛掉了
因为i中含有prime[j], prime[j] 比 prime[j+1] 小
在满足i%prme[j]==0这个条件之前以及第一次满足改条件时,prime[j]必定是prime[j]*i的最小因子。
这样我们便实现的线性筛
int ans[MAXN]; void Prime(int n) { int cnt=0; memset(prime,1,sizeof(prime)); prime[0]=prime[1]=0; for(int i=2;i<n;i++) { if(vis[i]) { ans[++cnt]=i;//保存素数 for(int j=i*i;j<n;j+=i)//i*i开始进行了稍微的优化 prime[j]=0;//不是素数 } } return; }
通过观察我们可以发现一个问题,这种方法会重复筛除合数,影响了效率。
比如,当30,在2*15筛了一次,在5*6又筛了一次。
所以我们有了一个快速线性筛法,不会重复筛选同一个数,所以几乎是线性的。
首先我们要知道一个条件
任何一个合数都可以表示成一连串质数的乘积
每个合数有一个最小的质因子,用这个质因子筛去这个合数,这样时间就是线性的了。
至于实现,先来看下代码
#include <cstdio> #include <iostream> using namespace std; int prime[20000];//记录质数 int vis[20000];//标记是否是质数 int cnt; void Prime(int n) { vis[1]=1; for(int i=2;i<=n;i++) { if(!vis[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&i*prime[j]<=n;j++) { vis[i*prime[j]]=1; if(!(i%prime[j])) break; } } } int main() { int n; scanf("%d",&n); Prime(n); for(int i=1;i<=n;i++) if(!vis[i]) printf("%d ",i); return 0; }
刚刚说的让合数被它最小的质因数筛去在代码中的体现就是这句:
if(!(i%prime[j]))
break;
由于枚举是从小到大的,所以prime数组中的质数是递增的
如果i%prime[j]为零(即i为prime[j]的倍数)
那么i*prime[j+1]这个合数一定已经被prime[j] 乘以某个数筛掉了
因为i中含有prime[j], prime[j] 比 prime[j+1] 小
在满足i%prme[j]==0这个条件之前以及第一次满足改条件时,prime[j]必定是prime[j]*i的最小因子。
这样我们便实现的线性筛
相关文章推荐
- 打素数表高效方法(线性)
- 【模板】线性筛素数
- leetcode 204. Count Primes(线性筛素数)
- 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 线性筛素数+欧拉函数+莫比乌斯函数
- 普及练习场 普及常见模板 【模板】线性筛素数
- 线性筛选素数
- 对于线性时间筛选素数算法的理解
- 数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)
- 线性筛选素数。。。。线性哦
- 素数线性筛选法
- 线性时间素数筛
- 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- A%BProblem——线性筛素数与前缀和
- [置顶] 线性筛选同时得到欧拉函数表和素数表
- [转]线性筛法求质数(素数)表及其原理
- (模板)线性筛素数
- Libreoj #6165. 一道水题 (快速线性筛素数)
- 【题解】线性筛素数 线性统计范围质因数 小Y的智力游戏
- 洛谷P3383 线性筛素数(线性筛)