素數篩 埃氏篩 線性篩 區間篩)

2022-06-09 13:09:09 字數 618 閱讀 8866

顧名思義,素數篩就是用來篩素數的。。。

1.埃氏篩 o(nloglogn)

對於一般(不毒瘤)的素數題,埃氏篩就夠了

原理:任何合數都有小於自身的質因數

內容:對於每乙個素數將它的 2*i~[x/i]*i全部標記為1,使得所有的合數全被標記

不足:合數會被標記素因數次,不夠高效

void prime(int

x)

2.線性篩/尤拉篩 o(n)

線性比埃氏快了那麼一丟丟,一般來說可以忽略不計。。。loglogn對於一般的篩法就是個位數。。。

理念:對於任意數,篩去它的素數倍,直到遇到自身的質因數

void pri(int

x)

}}

3.區間篩 

總有些毒瘤出題人不滿足於以上兩種演算法,用一些超大資料折騰蒟蒻(me)們

於是,區間篩橫空出世

區間篩針對一定區間[l,r],統計區間中素數個數

理念:對於<=r的數,其質因數<=√r,因此對於[l,r]開乙個vis,然後用2~√r篩一遍,剩下的就是質數了,前提:r-l < = 1000000

從根本上說,就是在大區間上(稍稍優化過的)暴力求解

素數篩法(埃氏篩,線性篩)

時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...

埃氏篩法 素數篩

埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...

質數篩 埃氏篩

我們來看這麼一道問題 給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 n 10000000,m 100000 首先很容易聯想到使用列舉法來確定題目的整體框架 for i 1 m else 關鍵在於質數判斷部分。質數的判斷問題我們可以從定義出發。質數,又稱素數,是除了1...