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

前言

积性函数是OI中的数论题的重要组成部分 (一般都是涉及到各种因数啊,倍数啊,gcd啊


前置知识

整除分块(引理)

有下面这样一个式子:

[sum_{i=1}^n left lfloor {n over i} ight floor ]

求这样一个东西需要多久?(O(n))

仔细观察,我们会发现 (left lfloor {n over i} ight floor) 会有相同的取值。

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

有这样一个结论 (left lfloor {n over i} ight floor) 最多有 (2sqrt n) 种取值

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


莫比乌斯函数

定义

莫比乌斯函数,像这样 (mu(n))

[left{ egin{aligned} &mu(n)=0 (n为一个质数平方的倍数)&\ &mu(n)=(-1)^k (n的质因数的个数为 k)&\ end{aligned} ight.]

例如

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

一个性质

[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)=nprod_{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) imes1=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))
多试几次还可以得出(省略括号)

[muoverset{*1}{longrightarrow}eoverset{*1}{longrightarrow}1overset{*1}{longrightarrow}d ]

[varphioverset{*1}{longrightarrow}idoverset{*1}{longrightarrow}sigma ]

同时有

[muoverset{*mu}{longleftarrow}eoverset{*mu}{longleftarrow}1overset{*mu}{longleftarrow}d ]

[varphioverset{*mu}{longleftarrow}idoverset{*mu}{longleftarrow}sigma ]

可以看出,在狄利克雷卷积中(mu)相当于加法中的-1,e相当于0,1相当于1


解题

PS:推式子的技巧

枚举因数变为枚举倍数

[sum_{i=1}^nsum_{d|i}f(d)=sum_{d}sum_{i=1}^{lfloorfrac{n}{d} floor}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))
也就是那个重要性质 (sumlimits _{d|n}mu(d)=[n=1])

多说无用,来例题

[egin{aligned} 求&sum_{i=1}^nsum_{j=1}^m[gcd(i,j)==1]\ =&sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}mu(d) &(调用性质)\ =&sum_{i=1}^nsum_{j=1}^msum_{d|i&d|j}mu(d)\ =&sum_dsum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}mu(d) &(枚举因数变为枚举倍数)\ =&sum_dmu(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor &(交换求和顺序) end{aligned}]

还记得开始讲的整除分块吗?
(lfloorfrac{n}{d} floor) 只有 (2sqrt{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);
}

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

欧拉定理


筛法

欧拉筛

原文地址:https://www.cnblogs.com/ezoiLZH/p/13632073.html