积性函数大全(欧拉函数、莫比乌斯反演、杜教筛……)

前言

积性函数是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{aligned} &\mu(n)=0 (n为一个质数平方的倍数)&\\ &\mu(n)=(-1)^k (n的质因数的个数为 k)&\\ \end{aligned} \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);
}

其他类似的题都基本这样想

欧拉定理


筛法

欧拉筛

posted @ 2020-09-08 13:42  ezoiLZH  阅读(421)  评论(0编辑  收藏  举报