尤拉篩模板及大致原理

2021-10-04 16:47:49 字數 630 閱讀 3822

尤拉篩的目的:篩去合數,獲得質數。

篩去合數的依據:合數能由其他數的相乘得到,所以若乙個數能由其他數相乘得到,那麼它一定不是質數。

優化的依據:如果i%form[j]==0,那麼i = k·form[j],若有 i(k·form[j])==t*,則也有ki * form[j] == t。由此可見,合數t可以在i%form[j]==0時被篩掉,也可以在ki%form[j] == 0時被篩掉,之所以選擇在 ki 時篩去,是為了避免對乙個數進行重複篩選(i * form[j], i * form[j+1], i * form[j+2]···都可以在之後被篩掉)。

const

int maxn =

1e3+5;

bool prime[maxn]

;//prime[i] = true 表示i是質數;反之,i不是質數

int form[maxn]

;//form陣列存放maxn範圍內的所有質數

void

getprime()

}return

;}

模板 尤拉篩

思路 對於n以內質數的階乘,如果某個數大於等於p,那麼這個數的階乘 p一定等於0,於是答案為此數之前的質數的階乘之和mod p。注意 我們在處理階乘的時候,一定只跑一次for迴圈,不要每次都從1開始乘,以小數的階乘為基礎,不然會t include include include include in...

尤拉函式線性篩模板

此模板主要用來求1 n n 1e6 以內的尤拉函式,順帶把素數也篩了出來.尤拉函式表示n以內與n互素的數,其中phi 1 1。這裡主要利用了尤拉函式的兩個性質 1.若p是x的因子,則e p x p e x 證明直接利用算數基本定理就行了。2.若p是素數,且x與p互素,即x,p都為素數 則e p x ...

尤拉函式線性篩(模板)

關於尤拉函式篩法,之前一直用的o n 2 演算法 phi 1 1 邊打表邊篩選 for int i 2 i 1005 i phi i i for int i 2 i 1005 i if phi i i for int j i j 1005 j i phi j phi j i i 1 其實如果資料小的...