7 13 線性篩素數

2022-07-31 03:15:15 字數 785 閱讀 6190

今天我們講了一大堆數論的東西,目前本人稍微掌握一些的便是素數篩法,下面為了保護著珍貴的遺產,我決定寫一篇部落格來記錄一下,

談到素數篩法,相信大家歲熟悉的是暴力篩,我們大家只需要把數n的前1到sqrt(n)中所有的質數拿來和這個數n除一下看一下能否整除,如果能夠整除,說明這個n是素數,然後就依次這樣判定。

還有一種篩法是e篩,就是把每個數自己所有的倍數全部篩掉,當然其實你會發現我們只要把所有素數的倍數全部篩掉就可以了。

然後上面兩種篩法都不是我們今天的重點,我們今天要講的篩法是線性篩法——即通過某種方式使每個數都被自己的最小素因子篩去即可。注意:是最小的素因子!!!

其實實現還是非常的簡單了,我們從小到大依次列舉i,再列舉最小質因子pj,將i*pj篩去

而當i mod pj =0 時break出來,因為更大的pk,i*pk會被pj篩去而不是pk

舉乙個非常簡單的例子,就是如果說現在我們正在檢查數字6,我們正在用他篩去後面的一些合數,但是現在我們碰到了數字3,3是乙個素數,並且6除3餘0所以這時候我們應該把6break掉,因為在後面的後面早晚會碰見乙個合數既被3整除又被6整除,就會被訪問兩次,為了降低複雜度先break掉就只是他訪問了一次,節約了時間。

#includeusing namespace std;

bool mark[1000005];

int p[1000005];

int main()

} for(int i=1;i<=cnt;++i)

return 0;

}

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

素數線性篩

ps 證明 神牛部落格。include include using namespace std const int n 100100 int v n p n n,m,tot int main 首先,先明確乙個條件,任何合數都能表示成一系列素數的積。不管 i 是否是素數,都會執行到 關鍵處1 如果 i...

線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。in...