• 莫比乌斯反演练习


    有用的结论:
    1、若(f(n),g(n))均为积性函数,则(h_1(n)=f(n)g(n),h_2(n)=f*g)均为积性函数((f*g)表示两个函数的狄利克雷卷积)

    2、(sigma_0(xy)= sum_{i|x}sum_{j|y}[gcd(i,j)=1])

    证明:考虑将(xy)的每一个因数的一个映射.

    (xy=prod_{i=1}^m p_i^{alpha_i}(alpha _i>0),x=prod p_i^{gamma_i}(gamma_igeq 0); d|xy)(d=prod_{i=1}^m p_i^{eta_i}(eta_igeq 0)).那么对于(d),若将它映射到了两个数(s,t):对于它的每一个质因子(p_i)
    (1) 若(eta_ileq gamma_i),那么(p^{eta_i})就对(s)有贡献.
    (2)若(eta_i> gamma_i),那么(t)就有一个(p_i^{eta_i-gamma_i})的贡献.

    最后将所有贡献相乘得到(s,t).

    这样对(xy)的每一个质因子(p_i)(p_i|s)(p_i|t)至多只有一个成立,于是我们通过构造了一个一一映射的方式证明了上述定理.

    Sample 1

    给定(n,m,d),求

    [sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d] ]

    sol:

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d]\ =&sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}[gcd(i,j)=1]\ =&sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}sum_{k|gcd(i,j)}mu(k)\ =&sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

    大力数论分块就完事了.

    Sample 2

    给定(n,m)

    [sum_{i=1}^n sum_{j=1}^m gcd(i,j) ]

    直接用(varphi)进行反演的话就十分的easy

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^m gcd(i,j)\ =&sum_{i=1}^nsum_{j=1}^m sum_{d|gcd(i,j)} varphi(d)\ =&sum_{d=1}^nvarphi(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor end{aligned} ]

    直接数论分块就完事了,但是我们如果按照以往使用(mu)的话

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^m gcd(i,j)\ =&sum_{d=1}^ndsum_{i=1}^msum_{j=1}^m[gcd(i,j)=d]\ =&sum_{d=1}^ndsum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

    直接做看起来是(O(nsqrt n))的,无法应对多组询问.这里有一个经典套路:我们设(T=dk),则:

    [egin{aligned} &sum_{d=1}^ndsum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor\ =&sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{d|T}mu(d)frac{T}{d} end{aligned} ]

    (f(T)=sum_{d|T}mu(d)frac{T}{d}),显然(f(T)=mu *id),于是(f)积性,可以直接大力线筛了

    这里其实可以观察到(sum_{d|T}mu(d)frac{T}{d}=varphi(T)),本质就是个容斥原理数(1-n)中与(n)互质的数,写成卷积的形式就是(id*mu=varphi)

    Sample 3

    bzoj3529

    先丢掉(a)的限制,就是求

    [sum_{i=1}^nsum_{j=1}^msigma_1(gcd(i,j)) ]

    化一下式子可以得到

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^msigma_1(gcd(i,j))\ =&sum_{d=1}^n sigma_1(d) sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d]\ =&sum_{d=1}^nsigma_1(d)sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

    好了,如果你还记得上面那个题,就知道这里肯定还要换元,设(T=dk)

    [egin{aligned} &sum_{d=1}^nsigma_1(d)sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor\ =&sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{d|T}sigma_1(d)mu(frac{T}{d}) end{aligned} ]

    (f(T)=sum_{d|T}sigma_1(d)mu(frac{T}{d})=sigma_1*mu),显然积性,但是由于数据小所以直接(O(nlog_2 n))筛就完事了

    那么就回来考虑(a)的限制,也就是只有(sigma_1(d)leq a)(d)才会对答案有贡献,我们可以将(sigma_1(d))从小到大排序,同时将询问按照(a)的大小排序,每次将所有(sigma_1(d)leq a)(d)枚举其倍数更新贡献,这个可以用树状数组维护,之后直接(O(sqrt n))回答询问即可

    Sample 4

    bzoj3994

    给定(n,m),求

    [sum_{i=1}^nsum_{j=1}^msigma_0(ij) ]

    sol:
    根据本文最开始的结论,有

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^msigma_0(ij)\ =&sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}[gcd(x,y)=1]\ =&sum_{x=1}^nsum_{y=1}^m{lfloorfrac{n}{x} floor}{lfloorfrac{m}{y} floor}[gcd(x,y)=1]\ =&sum_{x=1}^nsum_{y=1}^m{lfloorfrac{n}{x} floor}{lfloorfrac{m}{y} floor}sum_{d|gcd(x,y)} mu(d)\ =&sum_{d=1}^nmu(d)sum_{x=1}^{lfloorfrac{n}{d} floor}sum_{y=1}^{lfloorfrac{m}{d} floor} lfloorfrac{n}{xd} floorlfloorfrac{m}{yd} floor end{aligned} ]

    这里的问题是,我们并不能像之前那样令(T=xd),原因是这样的话(yd)会变得非常棘手,我们需要考虑一些更本质的东西。

    (f(n)=sum_{i=1}^nlfloorfrac{n}{i} floor),那么最终的答案可以写作

    [sum_{d=1}^nmu(d)f(lfloorfrac{n}{d} floor)f(lfloorfrac{m}{d} floor) ]

    现在考虑如何快速求(f(n)),把(f(n))看做每次枚举一个因数(i),数一下有多少个数是它的倍数且(leq n),于是不难发现(f(n)=sum_{i=1}^nsigma_0(i)),于是我们先(O(nlog_2n))求出(sigma_0(n)),再求其前缀和(f),最后套数论分块即可。

  • 相关阅读:
    高精度A+B
    基本定积分求面积
    二进制算子集和
    linux命令
    Dubbo
    java 集合区别
    Java中Comparable和Comparator区别
    synchronized实现原理
    ThreadLocal 原理
    java volatile关键字
  • 原文地址:https://www.cnblogs.com/encodetalker/p/12063149.html
Copyright © 2020-2023  润新知