zoukankan      html  css  js  c++  java
  • 狄利克雷卷积&莫比乌斯反演

    狄利克雷卷积

    定义:如果函数 (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)) 为负数时的处理)

  • 相关阅读:
    初步理解Java的三大特性——封装、继承和多态
    设计模式
    区分super和this
    类—矩形面积
    生成不重复的随机数(待完善)
    关于类的创建和调用
    生成验证码
    endsWith和startsWith同样效果其他形式的写法(2016.1.12)
    去除字符串中空格的方法(2016.1.12P141-2)
    java的抽象类
  • 原文地址:https://www.cnblogs.com/NuoCarter/p/15153998.html
Copyright © 2011-2022 走看看