1. 程式人生 > >莫比烏斯反演 狄利克雷卷積 杜教篩 學習筆記

莫比烏斯反演 狄利克雷卷積 杜教篩 學習筆記

前置知識:一些數論函式,比如尤拉函式、莫比烏斯函式的一些性質,積性函式及性質,整除分塊。
這裡預設大家會前置知識,如果不會請自行學習。

之前嘗試看過,結果後來都忘光了,於是還是決定應該寫個學習筆記記錄一下。

首先開始介紹莫比烏斯反演。
我們設 f ( d ) f(d)

F ( n ) F(n) 為定義在非負整數集合上的兩個函式,並且滿足下列條件: F (
n ) = d n f (
d ) F(n)=\sum_{d|n}f(d)
。那麼根據莫比烏斯反演,有 f ( n ) = d n μ ( d ) F ( n d ) f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)
證明一會兒講狄利克雷卷積之後再證。

當然,如果是 F ( n ) = n d f ( d ) F(n)=\sum_{n|d}f(d) ,那麼我們有 f ( n ) = n d μ ( d n ) F ( d ) f(n)=\sum_{n|d}\mu(\lfloor\frac{d}{n}\rfloor)F(d)

莫比烏斯反演經常用來解決這樣一類問題:我們要求 f ( n ) f(n) ,但是 f ( n ) f(n) 並不好求,但是我們可以找到一個函式 F ( n ) F(n) ,滿足 F ( n ) = d n f ( d ) F(n)=\sum_{d|n}f(d) 或者 F ( n ) = n d f ( d ) F(n)=\sum_{n|d}f(d) ,並且 F ( n ) F(n) 比較容易求出來,那麼我們就可以求出 F ( n ) F(n) ,然後利用反演求出 f ( n ) f(n) 。具體的程式碼實現時通常是用到整除分塊來做到 O ( n ) O(\sqrt{n}) 來算出結果。

這裡要用到一些複雜度優秀的篩法來預處理一些積性函式的字首和,通常是 μ \mu 函式。比較簡單地,我們可以用線性篩求出 μ \mu 函式等積性函式,然後 O ( n ) O(n) 求字首和。
但是我們會發現有些題目是需要複雜度更優秀的篩法的。我暫時還不會洲閣篩和min_25篩,於是在這裡介紹一下杜教篩。

杜教篩是一種利用狄利克雷卷積來求字首和的演算法,所以在介紹杜教篩之前我先來介紹一下狄利克雷卷積。
先介紹幾種函式,以下函式都是積性函式。
d ( n ) d(n) :表示 n n 的約數個數。 d ( n ) = d = 1 n [ d n ] d(n)=\sum_{d=1}^n[d|n] [   ] [\ ] 應該是表示內部如果是true的話就是1,否則就是0的樣子。
e ( n ) e(n) e ( n ) = [ n = 1 ] e(n)=[n=1]
1 ( n ) 1(n) :恆等函式,值始終是1
i d ( n ) id(n) :單位函式, i d ( n ) = n id(n)=n
μ \mu ϕ \phi 就不介紹了,但是介紹兩個重要的性質:
d n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1]
d n ϕ ( d ) = n \sum_{d|n}\phi(d)=n

好,開始介紹狄利克雷卷積。
兩個數論函式 f f g g 的卷積為 ( f g ) ( n ) = d n f ( d ) g ( n d ) (f*g)(n)=\sum_{d|n}f(d)g(\lfloor\frac{n}{d}\rfloor) 。前面的 * 表示卷積,後面的括號裡的 n n 是引數,通常不寫,預設是 n n

狄利克雷卷積滿足以下運演算法則:
1.交換律: f g = g f f*g=g*f
2.結合律: ( f g ) h = f ( g h ) (f*g)*h=f*(g*h)
3.分配律: ( f + g ) h = f h + g h (f+g)*h=f*h+g*h

狄利克雷卷積的一個性質是兩個積性函式的卷積仍然是一個積性函式。

我們介紹幾個常見的卷積:
1 μ = e 1*\mu=e
ϕ 1 = i d \phi*1=id
μ i d = ϕ \mu*id=\phi
1 1 = d 1*1=d
μ d = 1 \mu*d=1

於是我們可以證明莫比烏斯反演了。
F ( n ) = d