狄利克雷卷积&莫比乌斯反演

狄利克雷卷积

定义:如果函数 (F,f,g) 满足:

(F(n)=sumlimits_{d|n}f(d)g(frac{n}{d}))

(F)(f)(g) 的狄利克雷卷积,记作 (F=(f∗g)),或 (F(n)=(f∗g)(n))

显然,狄利克雷卷积满足交换律和分配律。

常见的完全积性函数

1.常函数 (I(n)=1)

2.恒等函数 (id(n)=n)

3.单位函数 (varepsilon(n)=[n=1]) 又叫单位元

性质1:

  • (f∗ε=f) (任何函数*单位元=本身)

  • 证明:

    ((f∗ε)(n)=sum limits_{d|n} f(d)ε(frac{n}{d}))

    所以当且仅当 (varepsilon(frac{n}{d})=1) 时,后面式子不为 (0) ,即 (d=n) 时,所以 ((f*varepsilon)(n)=f(n))

性质2:

  • (μ∗I=ε)(sumlimits_{d|n} mu(d) = [n==1])

  • 证明:

    (n=1) 时,(mu(1)=varepsilon(1)=1)

    需要证明的是当 (n>1) 时,(sumlimits_{d|n} mu(d) =0)

    首先将 (n) 进行质因数分解,即 (n=p_1^{a_1}*p_2^{a_2}....*p_n^{a^n})

    因为当且仅当 (n) 中质因数的幂次都为 (1) 时,(mu(n)) 才有值,所以我们不妨直接将指数去掉变为 (n=p_1*p_2...p_n) ,此时问题就变为了在 (n) 个质数中选 (k) 个的方案数再*上对应的权值,用式子表示出来就是:

    [sumlimits_{d|n} mu(d)=sumlimits_{k=0}^{n} C_n^k (-1)^k=sumlimits_{k=0}^n C_n^k(-1)^k(1^{n-k}) ]

    因为二项式定理:

    [(a+b)^n=sumlimits_{k=0}^n C_n^k a^k b^{n-k} ]

    所以

    [sumlimits_{k=0}^n C_n^k(-1)^k(1^{n-k})=((-1)+1)^n=0 ]

性质3:

  • (varphi*I=id)(sumlimits_{d|n} varphi(d)=n)

  • 证明:

    [n=sumlimits_{i|n}sumlimits_{j=1}^n [gcd(j,n)=i] \ =sumlimits_{i|n}sumlimits_{j=1}^{frac{n}{i}}[gcd(j,frac{n}{i})=1] \ =sumlimits_{i|n}varphi(frac{n}{i})=sumlimits_{i|n}varphi(i) ]

    第一步转化是等价于将 (n) 个数按照 (gcd) 分类,个数和为 (n) 。第二步是因为 (gcd(kx,ky)=k),所以 (gcd(x,y)) 于是可以把这个 (k) 除出去。

性质4:

(mu*id=varphi)(varphi(n)=sumlimits_{d|n} mu(d)*(n/d))

其实这个直接用卷积代换就可以证明了:

  • 证明:

    由之前的性质可以知道:(mu*I=varepsilon , id=varphi*I)

    所以可以推出:(mu*id=mu*varphi*I=(mu*I)*varphi=varepsilon*varphi=varphi)

性质5:

(d=I*I)

  • 证明:

    直接定义拆开:(d(n)=sumlimits_{d|n} 1)

    就是约数的定义了呀。

性质6

(sigma=I*id)

  • 证明

    老定义证明了。。(sigma(n)=sumlimits_{d|n} 1*id(d))

    显然。

性质7

(mu*d=I)

还是直接卷积代换吧:

  • 证明:

    (d=I*I)

    (mu*d=mu*I*I=(mu*I)*I=varepsilon*I=I)

    上面的证明大部分都是照着这位大佬的博客打的,如果讲的不清楚可以看一看,写的很好!

上面性质的汇总:

(d=I*I)

(sigma=I*id)

(mu*id=varphi)

(varphi*I=id)

(μ∗I=ε)

(f∗ε=f)

莫比乌斯反演

WJX的整除分块小总结

听过许多次也考了好几次了,被教练叫过来学了。

首先一切的一切,得从莫比乌斯函数讲起:

定义函数 (mu(x)) (莫比乌斯函数)。

(mu(x)) 只有 (3) 种取值,(-1,0,1) 分别表示:

(-1) : (x) 的质因子的最高幂次为 (1) ,并且有奇数个质因子。

(0) : (x) 的质因子的最高幂次 (geq1)

(1) : (x) 的质因子的最高幂次为 (1) ,并且有偶数个质因子。

简单来说就是:当 (x) 的质因子最高幂次为 (1) 时,(mu(x)=(-1)^k)(k) 表示质因子个数。

否则 (mu(x)=0)

并且规定 (mu(1)=1)

关于容斥系数:

其实如果你懂欧拉函数((phi(x)))容斥的推导过程:

即:(varphi(n) = n(1-frac{1}{p_1}-frac{1}{p_2}-cdots+frac{1}{p_1p_2}+frac{1}{p_1p_3}+···+frac{1}{p_{m-2}p_{m-1}}-frac{1}{p_1p_2p_3}-···))

你会发现:当分母有奇数个质数的时候,前面的符号为 (-) ,偶数个质数的时候,符号为 (+) 。(虽然刚刚好与莫比乌斯函数的取值相反)

但是你也可以大概懂得为什么莫比乌斯函数被叫做容斥系数,许多时候计算关于因数的一些东西的时候,莫比乌斯函数就可以让容斥变得简单许多。

莫比乌斯函数的一些小性质:

借用别的大佬的一段话:

首先,我们可以先明确一点,莫比乌斯函数并不是什么很高大上的东西,它其实只是一个由容斥系数所构成的函数。

1. 是个积性函数

这一点感性理解就好了,也是 (mu(x)) 可以线性筛 (Theta(n)) 求的基础。

2.联系欧拉函数

对于任意的正整数 (n)(sumlimits_{d|n} frac{mu(d)}{d}=frac{varphi(n)}{n})

很常用的一个性质

对于任意的正整数 (n)(sumlimits_{d|n} mu(d) = [n==1]) 这个下面的许多推导都会用到。证明见狄利克雷卷积性质 2。

线性筛莫比乌斯函数:

直接给出代码好了,毕竟挺好理解的。

inline void Init_mu(int lim){
    mu[1]=1;
    for(register int i=2;i<=lim;++i){
        if(!isprime[i]) prime[++tot]=i,mu[i]=-1;
        for(register int j=1;j<=tot&&prime[j]*i<=lim;++j){
            isprime[i*prime[j]]=true;
            if(i%prime[j]==0)   break;
            else mu[i*prime[j]]=-mu[i];
        }
    }
    return;
}

莫比乌斯反演

  • 定义两个函数 (g(n))(f(n))

    莫比乌斯反演的因数形式

  • 莫比乌斯反演定理:对于这两个定义在非负整数几何上的两个函数并且满足:

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

    则:

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

  • 证明:(先展示不用卷积的证明方法)

1.将 (f(n)) 拆开

[sum_{d|n}mu(d) g(frac{n}{d})=sum_{d|n}mu(d) sum_{k|frac{n}{d}} f(k) ]

2.因为 (d)(frac{n}{d}) 是成对出现的,这个式子还可以变为:

[sum_{k|n} f(k)sum_ {d|frac{n}{k}} mu(d) ]

3.因为上面 (sum_{d|n} mu(d) = [n==1]) 所以当且仅当(frac{n}{k}==1) 时,才会用值,即(k==n) 时,所以

[sum_{k|n} f(k)sum_ {d|frac{n}{k}} mu(d)=f(n) ]

最后给出整个过程:

[sum_{d|n}mu(d) g(frac{n}{d})=sum_{d|n}mu(d) sum_{k|frac{n}{d}} f(k)=sum_{k|n} f(k)sum_ {d|frac{n}{k}} mu(d)=f(n) ]

当然还可以用狄利克雷卷积更轻松地证明:

  • 证明:

    给出的条件即 (g=I*f)

    证明的为 (f=mu*g)

    因为 (f*varepsilon=f=mu*g)

    又因为 (mu*I=varepsilon)

    所以 (f*mu*I=mu*g)

    同时消去 (mu)(f*I=g)

另外一种形式(莫比乌斯反演的倍数形式):

  • 还是两个函数 (g(n))(f(n))

如果

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

简单说就是倍数之和。

则:

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

下面是照搬 OIwiki 上面的证明:

[egin{aligned} &sum_{n|d}{mu(frac{d}{n})f(d)} \ =& sum_{k=1}^{+infty}{mu(k)f(kn)} = sum_{k=1}^{+infty}{mu(k)sum_{kn|d}{g(d)}} \ =& sum_{n|d}{g(d)sum_{k|frac{d}{n}}{mu(k)}} = sum_{n|d}{g(d)epsilon(frac{d}{n})} \ =& g(n) end{aligned} ]


做的一些题目:

「雅礼day2」最大公约数gcd

题目大意:

(n) 个正整数 (x_1…x_n) ,初始时状态均为未选。有 (m) 个操作,每个操作给定一个编号 (i) ,将(x_i) 的选取状态取反。每次操作后,你需要求出选取的数中有多少个互质的无序数对。(n leq 10^5 mleq 10^5 x_ileq10^5)

做题的初始思路:

每次求完因数过后的 bitset 求并,但是这样的复杂度肯定是爆炸的。

所以我们只考虑每次插入和删除所带来的贡献:

所以设插入的元素为 (t) ,每次带来的贡献就是下式:

[egin{aligned} & sumlimits_{i=1}^{n} [gcd(x_i,t)==1] \ & =sum_{i=1}^n sumlimits_{d|t d|x_i} mu(d) \ & = sumlimits_{d|t} sumlimits_{i=1}^n mu(d) [ x_i|t ] end{aligned} ]

察觉到,后面的Sigma实质上就是有当前因子 (d)(a_i) 的个数,所以每次维护一个因数的集合大小就可以了。

Code


P2257 YY的GCD

P2257 YY的GCD

神犇 YY 虐完数论后给傻× kAc 出了一题
给定 (N, M),求 (1 leq x leq N)(1 leq y leq M)(gcd(x, y)) 为质数的 ((x, y)) 有多少对。

直接开始推式子:

题目要求的式子:

[sumlimits_{i=1}^n sumlimits_{j=1}^msum [gcd(i,j)in prime] ]

(g(d))(gcd(i,j)=d) 的个数,(f(d))(gcd(i,j)=d)(d) 的倍数的个数,用式子表示以下就是:

[g(d)=sumlimits_{i=1}^{n}sumlimits_{j=1}^{m} [gcd(i,j)==d] \ f(d)=sumlimits_{d|n} g(n)=lfloorfrac{N}{d} floorlfloorfrac{M}{d} floor ]

这个式子就是上面莫比乌斯反演的另一种形式,于是:

[g(n)=sumlimits_{n|d} mu(frac{d}{n}) f(d) ]

答案要求的式子可以变成:

[sumlimits_{pin prime} g(p)=sumlimits_{pin prime} sum limits_{p|d} mu(frac{d}{p}) f(d)=sumlimits_{pin prime}sumlimits_{p|d}mu(frac{d}{p})lfloorfrac{N}{d} floorlfloorfrac{M}{d} floor ]

换一种形式表达上面的式子,也就是枚举倍数再看质因数:

[sumlimits_{d=1}^{min(n,m)}sumlimits_{p|d pin prime} mu (frac{d}{p}) lfloorfrac{N}{d} floorlfloorfrac{M}{d} floor=sumlimits_{d=1}^{min(n,m)}lfloorfrac{N}{d} floorlfloorfrac{M}{d} floorsumlimits_{p|d pin prime} mu (frac{d}{p}) ]

后面的Sigma可以先线性筛处理 (mu(i)) 然后 (Theta(nloglog n)) 处理和得出(类似埃氏筛)。然后合在一起的Sigma前半部分整除分块后半部分前缀和统计就好了。

Code

P6810 「MCOI-02」Convex Hull 凸包

计算 (sumlimits_{i=1}^nsumlimits_{j=1}^m d(i)*d(j)*d(gcd(i,j)))

首先经典的将枚举的换为 (gcd) ,式子就变为:

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{i=1}^nsumlimits_{j=1}^{m} d(i) d(j) [gcd(i,j)==d] ]

再将 (d) 除出去。

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}sumlimits_{j=1}^{lfloorfrac{m}{d} floor} d(id) d(jd) [gcd(i,j)==1] ]

然后将 ([gcd(i,j)]) 代换掉。

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}sumlimits_{j=1}^{lfloorfrac{m}{d} floor} d(id) d(jd) sumlimits_{t|{gcd(i,j)}} mu(t) ]

然后再交换枚举顺序,先枚举 (t)

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{t=1}^{min(lfloorfrac{n}{d} floor,lfloorfrac{m}{d} floor)}mu(t)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}sumlimits_{j=1}^{lfloorfrac{m}{d} floor} d(id) d(jd) [t|gcd(i,j)] ]

右边可以再除一个 (t)

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{t=1}^{min(lfloorfrac{n}{d} floor,lfloorfrac{m}{d} floor)}mu(t)sumlimits_{i=1}^{lfloorfrac{n}{dt} floor}sumlimits_{j=1}^{lfloorfrac{m}{dt} floor} d(idt) d(jdt) ]

不妨将 (dt) 换成 (x)

[sumlimits_{d=1}^{min(n,m)}d(d)sumlimits_{d|x}^{min(n,m)}mu(frac{x}{d})sumlimits_{i=1}^{lfloorfrac{n}{x} floor}sumlimits_{j=1}^{lfloorfrac{m}{x} floor} d(ix) d(jx) ]

可以把 (d(d)) 丢进下一个Sigma,在变为枚举 (x)

[sumlimits_{x=1}^{min(n,m)}sumlimits_{d|x}^{min(n,m)} d(d)mu(frac{x}{d})sumlimits_{i=1}^{lfloorfrac{n}{x} floor}sumlimits_{j=1}^{lfloorfrac{m}{x} floor} d(ix) d(jx) ]

因为 (d*mu=I) (这点可以见上面的性质 (7))

所以整个式子直接变为:

[sumlimits_{x=1}^{min(n,m)}sumlimits_{i=1}^{lfloorfrac{n}{x} floor}sumlimits_{j=1}^{lfloorfrac{m}{x} floor} d(ix) d(jx) ]

后面的两个式子可以在线性筛因子个数后 (Theta(n)) 求出。

Code

P1829 [国家集训队]Crash的数字表格 / JZPTAB

计算 (sumlimits_{i=1}^{n}sumlimits_{j=1}^{m} {lcm(i,j)})

解释见下文,先直接写式子:

[egin{aligned} &=sumlimits_{i=1}^nsumlimits_{j=1}^m frac{i*j}{gcd(i,j)} ① \ &=sumlimits_{d=1}^{min(n,m)} sumlimits_{i=1}^n sumlimits_{j=1}^m [gcd(i,j)==d] frac{i*j}{d} ② \ &=sumlimits_{d=1}^{min(n,m)} sumlimits_{i=1}^{lfloor frac{n}{d} floor} sumlimits_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)==1] i*j*d ③ \ &=sumlimits_{d=1}^{min(n,m)} d sumlimits_{i=1}^{lfloor frac{n}{d} floor} sumlimits_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)==1] i*j ④ \ &=sumlimits_{d=1}^{min(n,m)} d sumlimits_{i=1}^{lfloor frac{n}{d} floor} sumlimits_{j=1}^{lfloor frac{m}{d} floor} sumlimits_{k|gcd(i,j)} mu(k) i*j ⑤ \ &=sumlimits_{d=1}^{min(n,m)} d sumlimits_{k=1}^{min(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor)}mu(k) sumlimits_{i=1}^{lfloor frac{n}{d} floor} sumlimits_{j=1}^{lfloor frac{m}{d} floor} [k|gcd(i,j)] i*j ⑥ \ &=sumlimits_{d=1}^{min(n,m)} d sumlimits_{k=1}^{min(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor)}mu(k) sumlimits_{k*i i=1}^{lfloor frac{n}{d} floor} sumlimits_{k*j j=1}^{lfloor frac{m}{d} floor} i*j*k^2 ⑦ \ &=sumlimits_{d=1}^{min(n,m)} d sumlimits_{k=1}^{min(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor)}mu(k) k^2 sumlimits_{i=1}^{lfloor frac{n}{dx} floor} sumlimits_{j=1}^{lfloor frac{m}{dx} floor} i*j ⑧ end{aligned} ]

①:是根据 (lcm) 的定义转换的。

②:交换枚举顺序。

③:将枚举的 (gcd) 提出,右边实际上是除的 (d^2) 所以要乘一个 (d)

④:把 (d) 提出去

⑤:将 ([gcd(i,j)==1]) 用莫反转换为 $sumlimits_{k|gcd(i,j)} mu(k) $

⑥:在转换枚举顺序,将 (k) 提前。

⑦:让他们都乘一个 (k) ,也就是强制拥有一个 (k) 的因数,这样就可以直接省去一个判断 (k|gcd(i,j)) 的条件

⑧:将 (k^2) 提出,预处理出 (mu(k)*k^2) 的前缀和后二次整除分块可以求出答案。

复杂度:(Theta(n^{frac{3}{4}}))

Code

CF900D Unusual Sequences

求解 (gcd=x) 和为 (y) 的数列有多少种

首先,当 (x mid y) 时,是无解的。

所以不妨将当前的所有数都除 (x) ,问题也就转化为了给定和为 (frac{y}{x}) ,所有数的 (gcd=1) 的方案总数。

姑且先不考虑 (gcd=1) 的条件:

(g(x)) 为若干个正整数和为 (x) 方案数:

用隔板法+二项式反演 很容易得出:$g(x)=sumlimits_{i=1}^x dbinom{x-1}{i-1}=sumlimits_{i=1}^x dbinom{x-1}{i-1} 1^{i-1} *1{x-i}=2{x-1} $

那么加上 (gcd=1) 的条件。

(f(x)) 为若干个数和为 (x) ,它们的 (gcd=1) 的方案数。

显然:(g(x)=sumlimits_{d|x} f(d)) (也就是每一种正整数解都可以由它的最简形式(即 (gcd=1) 的形式)扩大若干倍转化过来。

根据莫比乌斯反演的因数形式可以得到:

(f(x)=sumlimits_{d|x} mu(frac{x}{d}) g(x))

这个式子,因为 (x)(10^9) 级别的,无法用线性筛快速求解 (mu) 函数,那么就直接 (sqrt{x}) 直接定义法求得了,但是时间卡得比较紧,可以再加一个线性筛只用质数,这样复杂度就是(Theta(frac{sqrt{x}}{log x}))(g(x)) 也珂以通过快速幂快速求得。

总体复杂度应该是 (Theta(sqrt{m}*(frac{sqrt{m}}{log m}+log m))=Theta(frac{m}{log m}+sqrt{m}log m)) CF神机上应该是稳稳跑过得。

Code

(注意 (mu(x)) 为负数时的处理)

原文地址:https://www.cnblogs.com/NuoCarter/p/15153998.html