積性函式求字首和

2021-07-15 09:32:03 字數 1380 閱讀 5840

若函式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 儲...