积性函数是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);
}
其他类似的题都基本这样想
欧拉定理
筛法
欧拉筛