文章目录
一 . 何为线性筛法
线性筛法 , 就是在线性时间(O(n) )把素数用筛选方法找出的算法 。
其中重要的思想就是每个数只会被最小质因子筛,相对于埃氏筛O(nlogn)更快。
二.代码
例题 : [ACWing 868 筛素数](868. 筛质数 - AcWing题库)
#include <bits/stdc++.h>
using namespace std ;
const int N = 1000200;
int primes[N] ,cnt ; // primes数组记录每个素数 ,cnt记录素数个数
bool st[N] ; //st记录是否筛
int main(){
int n;
cin >> n;
for(int i = 2; i <= n ; i++){
if(!st[i]) primes[cnt++] = i;
for(int j = 0 ; primes[j] <= n / i ; j++){
st[ primes[j] * i ] = true;
//划去合数
if( i % primes[j] == 0) break; // #
//难点在这 线性筛的原理就是用最小的质因子筛去该数 break了的原因就是已经找到了i的最小质因数primes[j] , 也是primes[j] * i 的最小质因数 ,故不能再往下迭代 , 下面会更详细讨论
}
}
cout <<cnt;
return 0;
}
对于上面的难点 , 主要理解i % primes[j] == 0 或者 != 0 的情况
-
i % primes[j] == 0 (以下prrims[j] 简称 p)
由于p 是从小到大的素数 ,此处p是 i 的最小质因子 , 也是 i * p 的最小质因子
-
i % primes[j] != 0
p小于 i 的最小质因子 , 也是 i * p的最小质因子
三.总结
线性筛法较为常用 , 以后的欧拉函数等也会用到,尽量掌握