積性函數的整理


定義

如果一個數論函數\(f(n)\)滿足

\[f(pq)=f(p)f(q),p\perp q \]

則稱\(f(n)\)是一個積性函數。

特別的,如果不要求\(p\perp q\)且依然滿足上述式子的話,則稱\(f(n)\)是一個完全積性函數。

簡單約定

\((i,j)\)表示\(gcd(i,j)\)

\([a]\)表示一個條件判斷函數,當\(a\)為真是\([a]=1\),否則\([a]=0\)

\(i\perp j\)表示\((i,j)==1\)

狄利克雷卷積懶得打括號了。

常見積性函數

\[e(n)=[n=1] \]

\[1(n)=1 \]

\[\mu(n)=\begin{cases}(-1)^k&n=p_1p_2p_3\dots p_k\\0&n=p^2q\end{cases} \]

\[\varphi(n)=\sum_{i=1}^n[i\perp n] \]

\[d(n)=\sum_{i|n}1 \]

\[id(n)=n \]

\[\sigma(n)=\sum_{d|n}d \]

至於它們為什么是積性函數,,,,

我也管不了那么多了。

狄利克雷卷積

定義

\[f*g(n)=\sum_{d|n}f(d)g(\frac nd) \]

要計算的話可以把枚舉約數換成枚舉倍數(下面會講到),以調和級數\(O(nlogn)\)的復雜度求出\(f*g\)的前\(n\)項。

交換律

\[f*g(n)=\sum_{d|n}f(d)g(\frac nd)=\sum_{d|n}g(d)f(\frac nd)=g*f(n) \]

結合律

\[f*g*h(n)=\sum_{d|n}f(d)\sum_{t|\frac nd}g(t)h(\frac n{dt})=\sum_{d_1d_2d_3=n}f(d_1)g(d_2)h(d_3)=f*(g*h)(n) \]

常見積性函數的卷積

\[\forall f(n),e*f(n)=f(n) \]

\[1*1(n)=\sum_{d|n}1=d(n) \]

\[id*1(n)=\sum_{d|n}d=\sigma(n) \]

\[\mu*1(n)=\sum_{d|n}\mu(d)=[n=1]=e(n) \]

這個需要特別說明一下。

假設\(n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}\),那么上式可以改寫成:

\[\mu*1(n)=\sum_{c_1=0}^{k_1}\sum_{c_2=0}^{k_2}\dots\sum_{c_m=0}^{k_m}\mu(p_1^{c_1}p_2^{c_2}\dots p_m^{c_m}) \]

觀察\(\mu(n)\)的定義,可以發現它與\(n\)的質因子個數有關,而且當某個質因子出現不止一次時,\(\mu(n)=0\)。這樣的話,只要\(c_1\)\(c_n\)中有任意一個大於\(1\),后面那個\(\mu\)值就為\(0\)

這樣的話,我們就可以大大降低枚舉范圍:

\[\mu*1(n)=\sum_{c_1=0}^1\sum_{c_2=0}^1\dots\sum_{c_m=0}^1\mu(p_1^{c_1}p_2^{c_2}\dots p_m^{c_m}) \]

\[=\sum_{c_1=0}^1\sum_{c_2=0}^1\dots\sum_{c_m=0}^1(-1)^{\sum_{i=1}^mc_i} \]

\[=\sum_{i=0}^m(-1)^i\dbinom mi \]

\[=[m=0]=[n=1]=e(n) \]

至於最后那個式子為什么是\([m=0]\),證法多種多樣,這里不再贅述。

那么繼續:

\[\varphi*1(n)=\sum_{d|n}\varphi(d)=n=id(n) \]

這個又是為什么?

直接證比較麻煩,我們利用\(\mu*1=e\)證一個反過來的式子:

\[\varphi(n)=id*\mu(n) \]

直接暴力拆式子即可。要用到下面講到的一些技巧,可以回頭再來看。

\[\varphi(n)=\sum_{i=1}^n[i\perp n] \]

\[=\sum_{i=1}^n[(i,n)==1] \]

\[=\sum_{i=1}^n\sum_{d|(i,n)}\mu(d) \]

\[=\sum_{d|n}\mu(d)\frac nd \]

\[=id*\mu(n) \]

這樣,我們就完成了上述積性函數的大一統:

\[\mu\xrightarrow{*1}e\xrightarrow{*1}1\xrightarrow{*1}d \]

\[\varphi\xrightarrow{*1}id\xrightarrow{*1}\sigma \]

反過來也可以:

\[\mu\xleftarrow{*\mu}e\xleftarrow{*\mu}1\xleftarrow{*\mu}d \]

\[\varphi\xleftarrow{*\mu}id\xleftarrow{*\mu}\sigma \]

莫比烏斯反演

類似於二項式反演和斯特林反演,有一個這樣的反演式子:

\[f(n)=\sum_{d|n}g(d)\iff g(n)=\sum_{d|n}\mu(\frac nd)f(d) \]

其實沒毛用,因為它的本質就是這樣的:

\[f=g*1\iff g=\mu*f \]

但這樣看的話,似乎就是廢話了。

常用推式子技巧

無關項提前

本質是分配律。

\[\sum_{i=1}^n\sum_{j=1}^ma_ib_j=\sum_{i=1}^na_i\sum_{j=1}^mb_j \]

交換枚舉順序

\[\sum_{i=1}^na_i\sum_{j=1}^mb_j=\sum_{j=1}^mb_j\sum_{i=1}^na_i \]

這個看上去還是很\(naive\)

比較重要的是枚舉約數變成枚舉倍數:

\[\sum_{i=1}^na_i\sum_{d|i}b_d=\sum_{d=1}^nb_d\sum_{i=1}^{\lfloor\frac nd\rfloor}a_{id} \]

反演

就是活用上面那幾個常用積性函數的狄利克雷卷積關系式,尤其是\(\mu*1=e\)

算法

數論分塊

這個居然在我很\(naive\)的時候自己\(yy\)出來了。

舉個例子,求\(\sum_{i=0}^n\lfloor\frac ni\rfloor,n\leq10^9\)

不會的話打個表,然后就會了

\(n=100\)時,可以發現\(\lfloor\frac n{100}\rfloor,\lfloor\frac n{99}\rfloor,\dots,\lfloor\frac n{51}\rfloor\)都是\(1\)\(\lfloor\frac n{50}\rfloor,\lfloor\frac n{49}\rfloor,\dots,\lfloor\frac n{34}\rfloor\)都是\(2\),這樣的話,我們得到了一個可靠的結論:

\(\lfloor\frac n{\lfloor\frac ni\rfloor+1}\rfloor,\lfloor\frac n{\lfloor\frac ni\rfloor+2}\rfloor,\dots,\lfloor\frac n{\lfloor\frac n{i+1}\rfloor}\rfloor\)的結果都是\(i+1\)

這樣我們就得到了一個快速的根號算法:

對於大於\(\sqrt n\)的數,不同的\(\lfloor\frac ni\rfloor\)只有\(\sqrt n\)個;

小於\(\sqrt n\)的數只有\(\sqrt n\)個,直接暴力算即可。

線性篩

這個比較簡單,只要我們探究出\(f(p^k)\)的表達式,就可以線性篩出所有\(f(i)\)

杜教篩

假如我們要求\(s(n)=\sum_{i=1}^nf(i)\),如果我們能夠找到另一個函數\(g(n)\)使得\(g(n)\)\(f*g(n)\)都比較好求,我們就可以利用杜教篩。

具體過程是這樣的:

\[\sum_{i=1}^nf*g(i)=\sum_{i=1}^n\sum_{d|i}f(\frac id)g(d) \]

\[=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}f(i) \]

\[=\sum_{d=1}^ng(d)s(\lfloor\frac nd\rfloor) \]

\(d=1\)時,\(s(\lfloor\frac nd\rfloor)\)就是\(s(n)\),所以有

\[s(n)=\sum_{d=1}^ng(d)s(\lfloor\frac nd\rfloor)-\sum_{d=2}^ng(d)s(\lfloor\frac nd\rfloor) \]

\[=\sum_{i=1}^nf*g(i)-\sum_{d=2}^ng(d)s(\lfloor\frac nd\rfloor) \]

這樣,如果我們能夠快速求出\(\sum_{i=1}^nf*g(i)\)\(g(d)\),我們就可以對右邊數論分塊進行遞歸求解。我們可以用線性篩篩出前面一部分來優化復雜度。

復雜度是\(O(n^{\frac23})\),證明並不會,可以參考這個

\(min\_25\)

不會。

留着坑吧,沒准哪天會了

不過也要退役了

應用

1、求\(\sum_{i=1}^n\sum_{j=1}^m[i\perp j],n,m\leq10^9\)

需要用到的東西上面已經全部給出了。要注意\([i\perp j]\)其實就是\(e((i,j))\)

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|(i,j)}\mu(d) \]

\[=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac md\rfloor}1 \]

\[=\sum_{d=1}^n\mu(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor \]

數論分塊套上杜教篩求出\(\sum\mu(d)\)即可。

杜教篩\(\mu\)的話,令函數\(g\)\(1\)函數,此時\(\sum_{i=1}^n\mu*1(i)=1\)\(1\)函數本身也沒有任何難度可言。

2、求\(\sum_{i=1}^n\sum_{j=1}^m(i,j),n,m\leq10^9\)

同樣的,因為\((i,j)\)就是\(id((i,j))\),所以套用上一題做法即可。

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|(i,j)}\varphi(d) \]

\[=\sum_{d=1}^n\varphi(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor \]

杜教篩\(\varphi\)的話,我們同樣令\(g\)\(1\)函數,此時\(\sum_{i=1}^n\varphi*1(i)=\frac{n(n+1)}2\)

3、給出一個\(n*m\)的點陣,如果一對點連成的線段不經過其它點,那么稱這對點是合法的。求有多少合法的點對。

這是我原創的一道蠢題……做法就交給各位神仙了。

……

備注

給出一些可能用到的鏈接:

模板

杜教篩

例題

例題1

例題2(人生第一道紫題,自己yy出了一個\(O(n\sqrt n)\)的做法,現在看起來好\(low\)啊)

例題3(數據有誤)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM