尤拉篩學習筆記

2022-05-18 22:38:23 字數 1051 閱讀 4832

int prime[maxn],tot;

bool is_prime[maxn];

void choose(int n)

}}

考慮你在設計乙個線性篩質數演算法

你想,既然要做到「線性」,那麼每個數必須只能被篩一次

所以我們猜想,乙個合數只會被它的最小素因數篩去

memset(is_prime,1,sizeof(is_prime));
首先假設所有數都是素數

is_prime[1]=0;
確定$1$不是素數

for(int i=2;i<=n;i++)
列舉所有$[1,n]$區間內的數

if(is_prime[i])

prime[++tot]=i;

如果它在之前的篩選中「存活」下來,那麼它一定是個素數,把它加入素數列表

for(int j=1;j<=tot&&i*prime[j]<=n;j++)
列舉i與乙個素數能組成的所有合數,注意不要讓它們超過n

is_prime[i*prime[j]]=0;
標記為合數

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

break;

關鍵一步

如果i可以有乙個素數因子,就跳出迴圈

為什麼呢?

我們先來看線性篩質數的規則:

乙個合數只會被它的最小素因數篩去

如果i有別的素因數了,那麼堅強

證明它不是接下來的合數的最小素因數

所以為了保證執行效率,要跳出迴圈

$$ t(n) = o(n) $$

尤拉篩篩素數 - 學委的部落格

尤拉函式尤拉篩

尤拉函式求小於等於n與n互質的數的個數 複習時發現這個知識點竟然沒有整理 n為素數即為n 1 除了其本身 n為素數的倍數 ola sushu j i ola i sushu j else ola sushu j i ola i sushu j 1 include include include in...

線性篩(尤拉篩)

昨天的考試跪的一塌糊塗 第一題水過,第二題帶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 ...