若函式f滿足
a,b互質有f(a*b)=f(a)*f(b),我們則稱f是積性函式。
常見的比如尤拉函式,莫比烏斯函式,都屬於積性函式。
線性篩法,利用積性函式的積性,篩素數同時可以計算積性函式。
然而有些問題要求低於線性的複雜度。
同樣利用積性函式的性質。
舉常見的莫比烏斯函式為例。 求∑
ni=1
μ(i)
(1<=n<=10^10)
線性複雜度顯然無法接受。
杜教篩法如何解決呢? ∑d
|nμ(
d)=[
n=1]
設s(n)=∑n
i=1μ
(i)
s(n)=∑n
i=1∑
d|iμ
(d)−
∑ni=
1∑d|
i(dμ(d)
=1-∑n
i=1∑
d|i(
dμ(d)
接下來一步十分機智,考慮因為d|
i且d以有i/
d>=2
於是有
s(n)=1-∑n
i=2∑
⌊ni⌋
d=1μ
(d) (這裡的i表示的是d的幾倍)
=1-∑ni
=2s(
⌊ni⌋
) 可以加上分塊和記憶化優化, 複雜度為o(n3
4 )(怎麼算出來的——不會算)
還可以繼續優化,先預處理出n2
3 內的s的值,遞迴到時就可以直接返回,複雜度為o(n2
3 ),這就很可觀了。
如果是求∑n
i=1φ
(i) ,利用∑d
|nφ(
d)=n
,一樣的做就好了。
當然,有些積性函式並沒那麼好算,但出題人如果不是喪心病狂的話,通常是能用些機智做法做的。
例如f(x)=x∗
μ(x)
,顯然,f是乙個積性函式 ∑d
|xf(
d)∗x
/d=[
n=1]
設s(x)=∑n
i=1f
(i) ,結合上者則有
s(x)=1−
∑xi=
1∑d|
i(df(d)
∗(i/
d) =
1−∑x
i=2∑
⌊xd⌋
d=1f
(d)∗
i =1
−∑xi
=2i∗
s(⌊x
d⌋)
杜教篩會單獨被考嗎?這樣就水了,通常會和比較複雜的反演搞在一起。但是只要涉及積性函式,我們應有意識的想到杜教篩。
積性函式字首和
最近突然做到一些求積性函式字首和的題,用到了各種篩,有一題用到 min 25 篩法,於是好好學習了一波,運用極不熟練。後來又遇到一道杜教篩的題,結果發現自己連 phi x 字首和都不會推了?嚇得我趕緊複習 寫部落格。常見 完全 積性函式 整除分塊 dirichlet 卷積 埃氏篩 這裡還是簡單介紹一...
字首積與字尾積求大數取模
給出數列a1 a2 an,並設 現要求把所有的bi 算出來。輸入包含多組測試資料。對於每組資料,第1 行,1 個整數n 1 n 100 000 表示數列的長度。第2 行,n 個整數a1,a2,an 1 ai 109 表示給出的數列。輸入以乙個0 表示結尾。對於每組資料,輸出一行,n 個整數用空格分隔...
陣列 字首和 字首積及其應用
字首和 字首積也稱字首和陣列,字首積陣列。給一陣列a,字首和 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的和 字尾和 新建一陣列b,陣列中每一項b i 儲存a中 i n 1 的和 字首積 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的積 字尾積 新建一陣列b,陣列中每一項b i 儲...