1. 程式人生 > 實用技巧 >積性函式大全(尤拉函式、莫比烏斯反演、杜教篩……)

積性函式大全(尤拉函式、莫比烏斯反演、杜教篩……)

前言

積性函式是OI中的數論題的重要組成部分 (一般都是涉及到各種因數啊,倍數啊,gcd啊


前置知識

整除分塊(引理)

有下面這樣一個式子:

\[\sum_{i=1}^n \left \lfloor {n \over i}\right \rfloor \]

求這樣一個東西需要多久?\(O(n)\)

仔細觀察,我們會發現 \(\left \lfloor {n \over i}\right \rfloor\) 會有相同的取值。

比如:\({18\over 7}={18\over 8}={18\over 9}=2\)

有這樣一個結論 \(\left \lfloor {n \over i}\right \rfloor\)

最多有 \(2\sqrt n\) 種取值

所以可以 \(O(\sqrt n)\) 算出答案。


莫比烏斯函式

定義

莫比烏斯函式,像這樣 \(\mu(n)\)

\[\left\{ \begin{array}{lr} \mu(n)=0 &(n為一個質數平方的倍數)\\ \mu(n)=(-1)^k &(n的質因數的個數為 k)\\ \end{array} \right.\]

例如

\[\left. \begin{array}{lr} \mu(1)=1=(-1)^0\\ \mu(30)=-1=(-1)^3 &(30=2\times 3\times 5)\\ \mu(6)=1=(-1)^2 &(6=2\times 3)\\ \mu(12)=0 &(12=2^2\times 3) \end{array} \right.\]

一個性質

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

也就是當n=1是它的值才為1,其他情況都為0 (根據定義應該不難推出吧(逃


尤拉函式

定義

尤拉函式,就像是這樣 \(\varphi(n)\)

意思是說在 1 到 n,與 n 互質的數有多少個。

比如 \(\varphi(1)=1\)\(\varphi(7)=6\)\(\varphi(12)=4\)

表示式

\[\varphi(n)=n\prod_{i=1}^k(1-\frac{1}{p_i}) \]

\(p_i\)\(p\)的第\(i\)個質因數,k為質因數個數

其實很簡單,就是個容斥

n個數,減去p1的倍數,p2的倍數……再加回p1p2的倍數,減回p1p2p3的倍數……

一個性質

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

記著就好,就懶得貼證明了 (其實也不難(逃


迴歸正題——積性函式

什麼是積性函式

一個函式\(f(n)\),如果 \(f(nm)=f(n)f(m)\) (n與m互質),那麼它就是一個積性函式

另外,如果n、m不互質,上式依然滿足,那麼它是一個完全積性函式

很顯然,上面的莫比烏斯函式和尤拉函式都屬於積性函式

其他常見的積性函式

\(e(n)=[n=1]\) (元函式)
\(1(n)=1\)
\(id(n)=n\)
\(d(n)=\sum_{d|n}1\)(因數個數)
\(\sigma(n)=\sum_{d|n}d\) (因數和)


狄利克雷卷積

在這類OI題裡,總是會出現 \(\sum_{d|n}f(d)\) 這樣的式子,這下,就該狄利克雷卷積出場了

兩個積性函式 \(f(n)\)\(g(n)\),它們的狄利克雷卷積記為 \(f*g(n)\)

\[f*g(n)=\sum_{d|n}f(d)g(\frac{n}{d})$$ 或者 $$f*g(n)=\sum_{d_1d_2=n}f(d1)g(d2) \]

運演算法則

交換律

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

把 n/d 換成 d 很容易解決

結合律

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

常見卷積

仔細觀察 \(\sum_{d|n}f(d)=\sum_{d|n}f(d)\times1=\sum_{d|n}f(d)1(\frac{n}{d})=f*1(n)\)

再回到開始的兩個性質

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

所以可得 \(\mu*1(n)=e(n)\)\(\varphi*1(n)=id(n)\)
多試幾次還可以得出(省略括號)

\[\mu\overset{*1}{\longrightarrow}e\overset{*1}{\longrightarrow}1\overset{*1}{\longrightarrow}d$$ $$\varphi\overset{*1}{\longrightarrow}id\overset{*1}{\longrightarrow}\sigma$$ 同時有 $$\mu\overset{*\mu}{\longleftarrow}e\overset{*\mu}{\longleftarrow}1\overset{*\mu}{\longleftarrow}d$$ $$\varphi\overset{*\mu}{\longleftarrow}id\overset{*\mu}{\longleftarrow}\sigma \]

可以看出,在狄利克雷卷積中\(\mu\)相當於加法中的-1,e相當於0,1相當於1


解題

PS:推式子的技巧

列舉因數變為列舉倍數$$\sum_{i=1}^n\sum_{d|i}f(d)=\sum_{d}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(d)$$

莫比烏斯反演

\[f(n)=\sum_{d|n}g(d)\iff g(n)=\sum_{d|n}\mu(\frac nd)f(d)$$就是 $$f(n)=g*1(n)\iff g(n)=f*\mu(n)$$ ~~(幾乎是廢話)~~ 當然,重點不是這個,主要是要在式子中構造一個狄利克雷卷積 莫比烏斯反演常用的就是 $e(n)=\mu*1(n)$ 也就是那個重要性質 $\sum\limits _{d|n}\mu(d)=[n=1]$ 多說無用,來例題 $$\begin{aligned} 求&\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==1]\\ =&\sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d) &(呼叫性質)\\ =&\sum_{i=1}^n\sum_{j=1}^m\sum_{d|i\&d|j}\mu(d)\\ =&\sum_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\mu(d) &(列舉因數變為列舉倍數)\\ =&\sum_d\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor &(交換求和順序) \end{aligned}\]

還記得開始講的整除分塊嗎?
\(\lfloor\frac{n}{d}\rfloor\)只有\(2\sqrt{n}\)種取值,通過對每種取值分塊,預處理出 \(\mu\) 的字首和,就能 \(O(\sqrt{n})\) 求出答案

程式碼實現

\\ n/(n/i)可以算出 n/i 這個值最後出現的位置 (很簡單自己想

for(int i=1,pos;i<=min(n,m);i=pos+1){
	pos=min(n/(n/i),m/(m/i));
	ans+=(mu[pos]-mu[i-1])*(n/i)*(m/i);
}

其他類似的題都基本這樣想

尤拉定理


篩法

尤拉篩