• 莫比乌斯反演,狄利克雷卷积,杜教筛


    Part 1 莫比乌斯反演

    首先定义莫比乌斯函数(mu(n))
    (n=prod_{i=1}^mp_i^{k_i}),其中(p_{1-n})为互不相等的质数,则

    [mu(n)=egin{cases}0 & exists k_i>1(iin[1,m]) \(-1)^m & else end{cases} ]

    通俗地讲就是:如果(n)能被一个质数的平方整除,则(mu(n)=0),否则若(n)(m)个质因数,则(mu(n)=(-1)^m)

    所以(mu)函数可以线筛得到:

    mu[1]=1;
    for(int i=2;i<=n;++i){
    	if(!isnp[i])pri[++cnt]=i,mu[i]=-1;
    	for(int j=1;j<=cnt;++j){
    		rg int t=pri[j]*i;
    		if(t>n)break;
    		isnp[t]=1;
    		if(i%pri[j]==0)break;
    		mu[t]=-mu[i];
    	}
    }
    

    由定义可以得到几个结论:
    (1.mu(1)=(-1)^0=1)
    (2.mu(p)=-1)(p)为质数)
    (3.sum_{d|n}mu(d)=[n=1])。其中([])是条件运算符,当里面的条件成立时值为(1),否则为(0)
    下面来证明第三个结论。
    首先,若(n=1),结论显然成立。
    否则,我们同样把(n)写成(prod_{i=1}^mp_i^{k_i})的形式,那么结论的式子可以展开为

    [sum_{d_1=0}^{k_1}sum_{d_2=0}^{k_2}···sum_{d_m=0}^{k_m} mu(prod_{i=1}^mp_i^{d_i}) ]

    可以发现当存在一个(d_i>1)时,后面的(mu)的值为0。所以我们只需要考虑(d_i)(0)(1)的情况。这时可以把我们式子看成:在一个大小为(m)的集合中选任意个数,这些数的乘积的(mu)值之和。又由于这些数都是互不相等的质数,所以乘积的(mu)值只与选了多少数有关。那么枚举选了多少个数,式子就可以写成:

    [sum_{i=0}^m{mchoose i}(-1)^i \=sum_{i=0}^m{mchoose i}(-1)^i imes1^{m-i} \=0^m ]

    所以只有当(m=0),即(n=1)时,(sum_{d|n}mu(d)=1),其余都为0。

    接下来就是莫比乌斯函数的一种应用,被称为莫比乌斯反演。
    通常有两种式子:

    [若F(n)=sum_{d|n}f(d) \则f(n)=sum_{d|n}mu(dfrac{n}{d})F(d) ]

    证明很简单,把(F)展开即可:

    [f(n)=sum_{d|n}mu(dfrac{n}{d})sum_{r|d}f(r) \=sum_{r|n}f(r)sum_{d|frac{n}{r}}mu(dfrac{n}{dr}) \=sum_{r|n}f(r)sum_{d|frac{n}{r}}mu(d) ]

    根据上面的性质可以知道,只有当(r=n)时,第二个(sum)才有值,为1,此时等号右边等于(f(n))
    第二种式子为:

    [若F(n)=sum_{n|d}f(d) \则f(n)=sum_{n|d}mu(dfrac{d}{n})F(d) ]

    证明和上面类似:

    [f(n)=sum_{n|d}mu(dfrac{d}{n})sum_{d|r}f(r) \=sum_{n|r}f(r)sum_{d|frac{r}{n}}mu(d) ]

    同理,只有当(r=n)时,第二个(sum)有值,为1。
    下面总结的狄利克雷卷积有更好的方式证明第一种式子。

    Part 2 狄利克雷卷积

    首先总结一下积性函数和几个常见的积性函数。
    积性函数的定义为:若(n,m)互质,且(f(n) imes f(m)=f(nm)),则(f)为积性函数。
    另外有个完全积性函数的定义:若(f(n) imes f(m)=f(nm)),则(f)为完全积性函数。
    下面总结一下常见的积性函数:
    (1.e(n)=[n=1])元函数。
    (2.I(n)=1)常值函数。
    (3.id(n)=n)不知道叫什么函数。
    (4.p_k(n)=n^k)幂函数
    (4.mu(n))莫比乌斯函数,定义在上面。
    (5.varphi(n)=sum_{i=1}^n[gcd(i,n)=1]),即欧拉函数,意义是(n)以内与(n)互质的数的个数。
    (6.d(n)=sum_{d|n}1)约数个数函数,值为(n)的约数个数。
    可以注意到前四个实际上还是完全积性函数。
    积性函数可以通过欧拉筛(线筛)来求。

    狄利克雷卷积是一种运算,符号为(*),定义两个函数的狄利克雷卷积((f*g)(n)=sum_{d|n}f(d)g(dfrac{n}{d}))
    狄利克雷卷积有几个常用的式子:
    对于任意函数(f),都有((f*e)(n)=f(n))。证明就是把式子展开。
    ((mu*I)(n)=e)。展开之后就是莫比乌斯函数的结论。
    ((id*id)(n)=n imes d(n))还是展开再证明
    ((varphi*I)(n)=id(n))
    最后一个式子可以展开为(sum_{d|n}varphi(d)=n)
    这个式子有一个巧妙的证明和一个中规中矩的证明。

    巧妙的证明:
    尝试列出(dfrac{1}{n},dfrac{2}{n},···,dfrac{n}{n}),并把他们化为最简分数。设化简后的分母集合为(S)
    引理(1)(S)恰好为(n)的约数集。
    证明:若存在一个(n)的约数(d)不在(S)中,则(dfrac{n/d}{n})不在最初的数列中。不成立。
    (x)不是(n)的约数。由于最初的数列中没有一个数能化简得到分母为(x)的分数,所以(x)不可能在(S)中。得证。
    引理(2):对于(S)中的任意元素(x),化简后的数列中所有以(x)为分母的分数的分子都与(x)互质,且分子集合恰好是所有(x)以内与(x)互质的数。
    证明:分子分母显然,因为是最简分数。若存在一个数(yleq x)且与(x)互质,且不在分子集中出现过,则分数(dfrac{y imesfrac{n}{x}}{n})不在最初的数列中出现,不成立。得证。
    因此,化简后以约数(d)为分母的分数一共有(varphi(d))个。而分数一共有(n)个,因此(sum_{d|n}varphi(d)=n)

    中规中矩的证明:
    引理:(f(n)=sum_{d|n}varphi(d))为积性函数。
    证明:

    [f(n) imes f(m)=(sum_{d|n}varphi(d))(sum_{r|m}varphi(r)) \=sum_{d|n}varphi(d)sum_{r|m}varphi(r) \=sum_{d|n}sum_{r|m}varphi(d)varphi(r) \=sum_{dr|nm}varphi(dr) \=f(nm) ]

    这里涉及到(varphi)为积性函数。不懂就搜。

    [f(n)=prod_{i=1}^mf(p_i^{k_i}) \=prod_{i=1}^m(1+sum_{j=1}^{k_i}(p_i^j-p_i^{j-1})) \=prod_{i=1}^mp_i^{k_i}=n ]

    狄利克雷卷积也有运算律:
    ·交换律:(f*g=g*f)。根据狄利克雷卷积定义式可知其显然成立。
    ·结合律:((f*g)*h=f*(g*h))
    证明:

    [sum_{d|n}(sum_{r|d}f(r)g(frac{d}{r}))h(frac{n}{d}) \=sum_{d|n}sum_{r|d}f(r)g(frac{d}{r})h(frac{n}{d}) \=sum_{r|n}f(r)sum_{d|frac{n}{r}}g(d)h(frac{n}{dr}) ]

    ·分配律:((f+g)*h=f*h+g*h)。把左边展开即得证。

    上面说狄利克雷卷积可以证明莫比乌斯反演的第一个式子,现在填坑:
    (F(n)=sum_{d|n}f(d)),则(f(n)=sum_{d|n}mu(d)F(dfrac{n}{d}))
    证明:(F(n)=sum_{d|n}f(d))可以写成:(F=f*I)
    两边同时卷一个(mu)可以得到(F*mu=f*I*mu=f*(I*mu)=f*e=f(n))。即得证。

    同时还有一个常用的式子:(sum_{d|n}d imesmu(dfrac{n}{d})=varphi(n))
    证明:把左边写成(id*mu)。由于(id=varphi*I),所以(id*mu=varphi*I*mu=varphi*e=varphi(n))

    Part 3 杜教筛

    可以在(O(n^{frac{2}{3}}))的复杂度内求出(sum_{i=1}^nf(i))
    设要求的为(S(n)),并设(h=f*g)(g)是我们选的一个与(f)有联系的函数,最后会讲怎么选。则

    [sum_{i=1}^nh(i)=sum_{i=1}^nsum_{d|i}g(d)f(frac{i}{d}) \=sum_{d=1}^ng(d)sum_{i=1}^{lfloorfrac{n}{d} floor}f(i) \=sum_{d=1}^ng(d)S(lfloorfrac{n}{d} floor) ]

    然后把(d=1)的一项留着,其余的减过去,得到

    [g(1)S(n)=sum_{i=1}^nh(i)-sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor) ]

    这个就可以整除分块然后递归了。这就是杜教筛的套路式。
    观察这个式子,可以发现杜教筛的使用条件:
    (h)(g)的前缀和必须很好求。比如(f(i)=i)这样的函数。

    有几种常见的杜教筛:
    (1.sum_{i=1}^nmu(i))。由于(mu*I=e),而(sum_{i=1}^ne(i)=1),所以代进杜教筛的式子:

    [I(1)S(n)=sum_{i=1}^ne(i)-sum_{i=2}^nI(i)S(lfloorfrac{n}{i} floor) \S(n)=1-sum_{i=2}^nS(lfloorfrac{n}{i} floor) ]

    (2.sum_{i=1}^nvarphi(i))。由于(varphi*I=id)(sum_{i=1}^nid(i)=frac{n(n+1)}{2}),所以

    [S(n)=frac{n(n+1)}{2}-sum_{i=2}^nS(lfloorfrac{n}{i} floor) ]

    (3.sum_{i=1}^nivarphi(i))。把这个函数卷一个(id)正好可以消掉(i)

    [sum_{d|n}dvarphi(d) imes frac{n}{d}=nsum_{d|n}varphi(d)=n^2 ]

    (sum_{i=1}^ni^2=frac{n(n-1)(n-2)}{3}+frac{n(n-1)}{2}),也可以杜教筛。

    Part 4 例题

    P4450 双亲数:(sum_{i=1}^nsum_{i=1}^m[(i,j)=d])(n,mleq10^6,dleq min(n,m))
    假设(nleq m)。把(i,j)都除以(d)

    [sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor}[(i,j)=1] ]

    后面就是莫比乌斯函数的形式:

    [=sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor}sum_{r|(i,j)}mu(r) \=sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor}sum_{r|i,r|j}mu(r) ]

    发现(r)的值域是([1,lfloorfrac{n}{d} floor]),每个(r)对应的(i,j)都是(r)的倍数,所以

    [=sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r)sum_{r|i}sum_{r|j}1 \=sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r) lfloorfrac{n}{dr} floorlfloorfrac{m}{dr} floor ]

    可以(O(n))算了。

    P3768 简单的数学题:(sum_{i=1}^nsum_{j=1}^nij(i,j)pmod p)(nleq10^{10},p)为质数。
    枚举(gcd)

    [sum_{d=1}^nsum_{i=1}^nsum_{j=1}^nijd[(i,j)=d] \=sum_{d=1}^ndsum_{i=1}^nsum_{j=1}^nij[(i,j)=d] \=sum_{d=1}^nd^3sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{n}{d} floor}ij[(i,j)=1] \=sum_{d=1}^nd^3sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{n}{d} floor}ij sum_{r|(i,j)}mu(r) \=sum_{d=1}^nd^3sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r)r^2 sum_{i=1}^{lfloorfrac{n}{dr} floor} sum_{j=1}^{lfloorfrac{n}{dr} floor}ij \=sum_{d=1}^nd^3sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r)r^2 sum_{i=1}^{lfloorfrac{n}{dr} floor}i sum_{j=1}^{lfloorfrac{n}{dr} floor}j ]

    (F(n)=sum_{i=1}^ni=frac{n(n+1)}{2})

    [\=sum_{d=1}^nd^3sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r)r^2 F^2(lfloorfrac{n}{dr} floor) ]

    枚举(t=dr)

    [=sum_{t=1}^{n}t^2F^2(lfloorfrac{n}{t} floor) sum_{d|t}dmu(frac{t}{d}) ]

    后面这个(sum_{d|t}dmu(frac{t}{d}))就是(id*mu),把(id)拆开:

    [id*mu=(varphi*I)*mu=varphi*(I*mu)=varphi*e=varphi ]

    所以可以进一步写成:

    [sum_{t=1}^{n}F^2(lfloorfrac{n}{t} floor)t^2varphi(t) ]

    前面的(F)是个整除分块,设(f(n)=n^2varphi(t),g(n)=n^2),发现

    [(f*g)(n)=sum_{d|n}d^2varphi(d) imes (frac{n}{d})^2 \=n^2sum_{d|n}varphi(d)=n^3 ]

    [sum_{i=1}^ni^3=frac{n(n-1)(n-2)(n-3)}{4}+n(n-1)(n-2)+frac{n(n-1)}{2} \=F^2(n) ]

    那么设(S(n)=sum_{i=1}^nf(i))代入杜教筛式子:

    [S(n)=F^2(n)-sum_{i=2}^ni^2S(frac{n}{d}) ]

    不会证复杂度,但外面一个整除分块里面一个杜教筛,应该是(n^{frac{2}{3}})级别的吧

    P3911 最小公倍数之和:给定数组A,求(sum_{i=1}^nsum_{j=1}^nlcm(A_i,A_j))(n,A_ileq50000)
    转换一下思维,假设(A_i)出现(x)次,(A_j)出现(y)次,那么(lcm(A_i,A_j))会被算(xy)次。注意到(A_i)的范围很小,所以记(cnt_i)表示(i)(A)数组中出现的次数。
    重新定义(n=max{{}A_i{}}),那么答案可以写成:

    [sum_{i=1}^nsum_{j=1}^nlcm(i,j)cnt_icnt_j \=sum_{i=1}^nsum_{j=1}^nfrac{cnt_icnt_jij}{(i,j)} \=sum_{d=1}^nd sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{n}{d} floor}cnt_{id}cnt_{jd}ij[(i,j)=1] \=sum_{d=1}^nd sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{n}{d} floor}cnt_{id}cnt_{jd}ij sum_{r|(i,j)}mu(r) \=sum_{d=1}^ndsum_{r=1}^{lfloorfrac{n}{d} floor}r^2mu(r) sum_{i=1}^{lfloorfrac{n}{dr} floor} sum_{j=1}^{lfloorfrac{n}{dr} floor}cnt_{idr}cnt_{jdr}ij \=sum_{d=1}^ndsum_{r=1}^{lfloorfrac{n}{d} floor}r^2mu(r) sum_{i=1}^{lfloorfrac{n}{dr} floor}cnt_{idr}i sum_{j=1}^{lfloorfrac{n}{dr} floor}cnt_{jdr}j ]

    (f(n)=sum_{i=1}^ncnt_{in}i)(t=dr),枚举(t)

    [\=sum_{t=1}^ntf^2(frac{n}{t})sum_{d|n}dmu(d) ]

    (g(n)=sum_{d|n}dmu(d))

    [\=sum_{t=1}^ntf^2(frac{n}{t})g(t) ]

    发现计算(f)(g)的总复杂度等于(sum_{i=1}^nfrac{n}{i}=nln n),所以最后的式子直接暴力算,复杂度为(O(nln n))

    P2257 YY的GCD:设质数集合为(P),求(sum_{i=1}^nsum_{j=1}^m[(i,j)in P]),有(T)组数据,(Tleq 10^4,n、mleq10^7)

    假设(nleq m)。同样是枚举(gcd)

    [sum_{d=1,din P}sum_{i=1}^nsum_{j=1}^m[(i,j)=d] \=sum_{d=1,din P}sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor}[(i,j)=1] \=sum_{d=1,din P}sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor}sum_{r|(i,j)}mu(r) \=sum_{d=1,din P}sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r) sum_{i=1}^{lfloorfrac{n}{dr} floor} sum_{j=1}^{lfloorfrac{m}{dr} floor}1 \=sum_{d=1,din P}sum_{r=1}^{lfloorfrac{n}{d} floor}mu(r) lfloorfrac{n}{dr} floorlfloorfrac{m}{dr} floor ]

    枚举(t=dr)

    [\=sum_{t=1}^nlfloorfrac{n}{t} floorlfloorfrac{m}{t} floor sum_{d|t,din P}mu(frac{t}{d}) ]

    最后一个可以直接枚举(d),然后枚举(d)的倍数预处理出来。由于质数个数大概是(frac{n}{log n}),所以复杂度是(O(frac{n}{log n}ln frac{n}{log n})=O(n))
    前面的就整除分块,每个询问就可以(O(sqrt{n}))了。

  • 相关阅读:
    day13-web前端之JS与JQuery
    day16-python项目Django框架之基础
    day12-HTML、CSS与blog页面讲解
    day11-MySQL数据操作索引备份触发器
    day10-python并发编程之多线程协程及MySQL
    day9-python并发编程之多进程多线程
    day8-异常处理与网络编程
    面向对象实战扩展(课外阅读)
    day7-面向对象之继承组合多态封装等
    python学习大纲
  • 原文地址:https://www.cnblogs.com/akura/p/13282125.html
Copyright © 2020-2023  润新知