尤拉篩的目的:篩去合數,獲得質數。
篩去合數的依據:合數能由其他數的相乘得到,所以若乙個數能由其他數相乘得到,那麼它一定不是質數。
優化的依據:如果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 其實如果資料小的...