博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性筛素数(欧拉筛)
阅读量:4574 次
发布时间:2019-06-08

本文共 999 字,大约阅读时间需要 3 分钟。

线性筛素数(欧拉筛)

欧拉筛为啥是\(O(n)\)的呢?我们先来看看代码。

#include 
using namespace std;const int maxn=10000000;int n, m, prime[maxn], isnt_prime[maxn], tot;void get_prime(int n){ isnt_prime[0]=isnt_prime[1]=1; for (int i=2; i<=n; ++i){ //当前数是所有数小于n的数而不只是素数,这是欧拉筛与埃氏筛的区别 if (!isnt_prime[i]) prime[++tot]=i; for (int j=1; j<=tot&&i*prime[j]<=n; ++j){ //当前数乘上的素数为prime[j] isnt_prime[i*prime[j]]=1; if (i%prime[j]==0) break; } }}int main(){ scanf("%d%d", &n, &m); get_prime(n); int t; for (int i=0; i

设当前数i的分解为\(i=p_1^{\alpha_1}p_2^{\alpha_2}...p_k^{\alpha_k}\ (p_1<p_2<...<p_k)\),当前枚举的i要乘上的素数为\(p_j\),那么,我们要筛掉的数就是\(i*p_j\)

if (i%prime[j]==0) break;

这一行很重要。欧拉筛的特点,在于每个合数都被它的最小质因数筛掉。假设,当前被筛的数为\(x=i*p_j\)。如果\(p_j>p_1\),意味着\(p_j\)并不是x的最小质因数,等到i变的更大,变成某个\(i'\),x是可以被\(i'*p_1\)筛掉的。因此,如果发现\(p_j>p_1\),就没有必要再继续枚举p下去了。代码的含义其实相同:如果\(p_j\mid i\),意味着\(p_j=p_1\),因此后面枚举的\(p_j\)都大于等于\(p_1\),就不用继续枚举p了。

转载于:https://www.cnblogs.com/MyNameIsPc/p/9314082.html

你可能感兴趣的文章
Python学习3,列表
查看>>
最长回文子串
查看>>
JAVA基础-JDBC(一)
查看>>
js中for和while运行速度比较
查看>>
算法第5章作业
查看>>
7.9 练习
查看>>
基于ArcGIS JS API的在线专题地图实现
查看>>
learnByWork
查看>>
lua 函数
查看>>
Git的基本命令
查看>>
四平方和
查看>>
第十八周 12.27-1.2
查看>>
C# IP地址字符串和数值转换
查看>>
TCHAR和CHAR类型的互转
查看>>
常用界面布局
查看>>
C语言—— for 循环
查看>>
IBM lotus9.0测试版即将公测
查看>>
xml常用方法
查看>>
Cube Stacking(并差集深度+结点个数)
查看>>
AndroidStudio3更改包名失败
查看>>