篩法是乙個很方便,很快捷的方法,金典的演算法很多都是使用曬法來解決的。比如金典的求尤拉函式,求莫比烏斯函式,。以及一些篩素數等。但是什麼型別的題目可以使用自己自創的篩法呢。
1.最典型的函式型別 f(
x)=∑
d|xg
(x,d
) 這種型別的函式是金典的篩法使用。你可以這樣想,篩法的本質是列舉每個數的同時找到這個數對其他需要這個數的貢獻。其實也是乙個貢獻的思想,但是注意一點,必須要可以使用某種列舉方法使得x可以更新所有比他大的需要更新的值。但是對於上述的函式,只要列舉x的時候,內層迴圈列舉x的倍數。這樣就可以得到x對內層y的共享,加到f(y)上就可以了。其中列舉的外層i為d,內層j為x,就可以算出x了。金典的貢獻思想,並且使用這個可以解決很多的題目。
2.可能上面的不是金典型別。但是還有一種也就可以使用篩法。那就是積性函式的求解。 f(
x)如果是積性函式,也可以使用篩法。所以如果簡單方法tle嗎,可以考慮內層迴圈是否是積性函式。其中使用線性曬法是最簡單的。因為線性篩就是求的是合數分解為最小的素數和合數的乘積。利用f(
x)=f
(p1)
∗f(p
2)..
..f(
pk) 可以通過素數更新,但是注意某些函式滿足部分積性。比如只有xy互素才可以滿足積性。這樣就要特判了。
目前只發現了這兩個,持續更新中。
數論 埃氏篩法
這學期的離散數學課程學了一點初等數論,其中的埃氏篩法當時課上沒有太懂,課後看了 挑戰程式設計競賽 一書終於弄懂了。這本書確實很好!演算法簡潔優美。如果只對乙個整數進行素性測試,通常o n 的演算法就足夠了。但如果要對許多整數進行素性測試,則有更為高效的演算法,其中就包括埃拉託斯特尼篩法,簡稱埃氏篩法...
數論基礎 埃氏篩法 區間篩法(模板)
區間篩法 求n之前的所有素數 原理1.如果採用利用文章中第乙個o sqrt n 的演算法,進行n次迴圈即可得到答案。顯然,這樣o nsqrt n 肯定超時,所以我們需要進行優化。2.如果我們判斷出a是素數,那麼我們就可以確定a的倍數都是合數。因此可以將這些倍數刪除,這樣就可以去掉一些不必要的判斷。3...
數論二 Eular質數篩法
如何去快速得求解 1,n 這個區間內素數的個數呢?自然我們已經知道了如何快速判定乙個數是否是質數,那麼我就直接將 1,n 之間每乙個數判定一次,就可以得到結果。雖然我們已經通過快速素數檢測將每一次判定的時間複雜度降低,但是n個數字的話,總的時間複雜度依舊很高。發現如果乙個數p是質數的話,那麼它的倍數...