線性篩(尤拉篩) 演算法解析

2021-10-10 00:16:36 字數 1054 閱讀 4157

尤拉篩是乙個能夠做到o(n)的時間複雜度的質數篩法。是目前最優秀的質數篩法,乙個十分基礎的工具,從原理上掌握它是非常有必要的。

1.核心**就在這裡:

for

(ll i=

2;i<=max;i++

)}

2.演算法的特點就是每個數隻會被自己的最小質因數篩過一次。

3.因為prime中素數是遞增的,所以如果i%prime[j]!=0代表i的最小質因數還沒有找到,即i的最小質因數大於prime[j]。也就是說prime[j]就是i*prime[j]的最小質因數,於是i*prime[j]被它的最小質因數篩掉了。

4.如果當i%prime[j]==0時,代表i的最小質因數是prime[j],那麼i*prime[j+k](k>0)這個合數的最小質因數就不是prime[j+k]而是prime[j]了。所以i*prime[j+k]應該被prime[j]篩掉,而不是後續的prime[j+k]。於是在此時break

5.綜上所述達到了每個數僅篩一次的效果,時間複雜度o(n)。

#include

#include

#include

#include

#include

#define max 1000000

using

namespace std;

typedef

long

long ll;

ll prime[

100010

],count1=0;

bool vis[max+10]

;void

oula()

}}intmain()

線性篩(尤拉篩)

昨天的考試跪的一塌糊塗 第一題水過,第二題帶wa的樸素,最後題忘了特判左端點全跪,分數比起預計得分整整打了個對折啊!步入正題 線性篩 尤拉篩 一般的篩法 ppt裡叫埃拉託斯特尼篩法,名字異常高貴 的效率是o nlglgn 其實很接近o n 啊!對於一些例如n 10000000的殘暴資料會跪,於是,線...

尤拉篩 線性篩

實現 include using namespace std const int max n 1e8 int prime max n cnt bool st max n 使用bool陣列節省空間 void is prime int n intmain 每個合數只被自己最小的質因子篩去。現在證明在i ...

尤拉篩(線性篩)

尤拉篩多用於篩素數,時間複雜度是o n 主要原理 合數 最小質因子 合數 質數 這個合數的組成是唯一的,尤拉篩裡面只在這種情況篩一次,也就是每個數就篩一次,可以完成o n 的複雜度。每當列舉到乙個數,把這個數當作後面的那個數,在已經得到的質數里列舉當作最小質因子,看看這樣的組合能找到哪個合數,但是要...