zoukankan      html  css  js  c++  java
  • 【Mobius绮丽的辗转】莫比乌斯反演

    Problem

    对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。
    1n500001ab500001cd500001k50000

    Sub problem

    Ans(i,j)表示有多少个数对(x,y),满足x≤i,c≤y≤j,且gcd(x,y) = k
    我们可以先求出Ans(b,d),Ans(b,c1),Ans(a1,d),Ans(a1,c1)
    然后ans=Ans(b,d)Ans(b,c1)Ans(a1,d)+Ans(a1,c1)

    那么问题就变成了如何求Ans(n,m)

    Discuss

    讨论一下Ans(n,m)如何求,其中n<m
    先设f(k),表示有多少个数对(x,y),满足x≤n,c≤y≤m,且gcd(x,y) = k
    显然Ans(n,m)=f(k)

    再设g(k),表示多少个数对(x,y),满足x≤n,c≤y≤m,且k|gcd(x,y)
    因为k|gcd(x,y),所以设x=kx,y=ky
    由于x只能取1...nky只能取1...mk

    所以

    g(k)=nkmk

    同时,我们会有

    g(k)=i=1nkf(ik)(1)

    此时,我们将g(k)f(k)表示,并且g(k)是容易求出结果的。


    Mobius

    正片开始
    

    我们非常功利地得出结论:
    正当我们遇到这种式子时,

    g(i)=d|if(d)(2)

    g(i)=j=1nkf(ij)(3)

    g[d]积性函数,我们可以将上式转化为,
    f(i)=d|ig(d)μ(id)

    f(i)=j=1nkg(ij)μ(j)

    其中
    μ(x)=1,(1)k,0,x=1x=ki=1pi,piPotherwise


    Discuss:μ的性质

    (1)μ是积性函数
    可以证明,μ函数也是积性函数,所以μ可以通过线性筛法预处理,如下代码。

    miu[1]=1;
    for (i=2;i<maxn;i++){
        if (!bz[i]){
            p[++p[0]]=i;
            miu[i]=-1;
        }
        for (j=1;j<=p[0];j++){          
            k=i*p[j];
            if (k>=maxn) break;
            bz[k]=true;
            if (i%p[j]==0){
                miu[k]=0;
                break;
            }else miu[k]=-miu[i];
        }
    }

    (2)μ的“和性质”

    d|nμ(d)={0,1,n=1n>1

    Back to the Problem

    题目的式子是

    g(k)=i=1nkf(ik)(1)

    (2)有异曲同工之妙,
    所以
    f(k)=i=1nkg(ik)μ(i)=i=1nknikmikμ(i)

    然而,这并没有什么卵用,我们仍然过不了。
    还能优化??

    Deeplier discuss

    我们发现,
    其实nikmik很多时候是相同的取值。
    所以我们可以将相同值的nikmik合并一起来计算,来优化时间复杂度。
    显然nik的取值最多有2n种,
    所以可以把时间复杂度优化到O(2n+2m)一次询问。

    Ending

    至此,我们已解决了这道题。
    原题Code

    Proving

    μ的“和性质”

    求证:

    d|nμ(d)={0,1,n=1n>1

    证明:
    n=1时显然;
    讨论n>1的情况,
    因为μ的定义,
    μ(x)=1,(1)k,0,x=1x=ki=1pi,piPotherwise

    所以d|nμ(d)中,只有当d的任意质因子的指数不能超过1时,μ(d)才会对产生贡献。
    我们设n质因子个数为q个。
    那么,
    d|nμ(d)=i=0qCiq(1)i

    我们观察一下杨辉三角:
    11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1...

    显然的是,当q是偶数时,由杨辉三角的对称性,
    d|nμ(d)=i=0qCiq(1)i=0

    现在考虑q(q>1)是奇数的情况,
    i=0qCiq(1)i=C0qCqq+i=1q1Ciq(1)i=C0qCqq+i=1q1(Ci1q1+Ciq1)(1)i=C0qCqq+i=1q1Ci1q1(1)i+i=1q1Ciq1(1)i=i=0q1Ciq1(1)i+1+i=0q1Ciq1(1)i

    q1是偶数,综上,
    d|nμ(d)=i=0qCiq(1)i=0

    得证。

    证明反演

    求证:

    g(i)=d|if(d)f(i)=d|ig(d)μ(id)

    证明:
    d|ig(d)μ(id)=d|iμ(id)d|df(d)

    这里经历一个重要的过程:转换主体,
    感性地想,所有的μ(id)都与f(d)相乘过,其中d|d
    反过来,那么所有的f(d)都与μ(id)相乘过,其中d|d
    所以,
    d|iμ(id)d|df(d)=d|if(d)d|d,d|iμ(id)

    x=id,则d=ix,那么
    d|if(d)d|d,d|iμ(id)=d|if(d)d|ix,ix|iμ(x)=d|if(d)x|idμ(x)

    μ的“和性质”,
    d!=i时,则id>1,所以x|idμ(x)=0
    d=i时,则id=1,所以x|idμ(x)=1
    所以
    d|if(d)μ(id)=d|if(d)x|idμ(x)=f(i)

    综上,
    f(i)=d|ig(d)μ(id)

    得证。


    另一个变式(3)类似。

    True Ending

    至此,Mobius反演已证明完毕。
    这里写图片描述

  • 相关阅读:
    poj1328
    xml入门简介--两天学会xml
    php的一些特殊用法
    数据结构(一)
    队列的 基本操作
    栈的 基本操作
    线性表----单链表
    线性表----顺序表
    数据结构
    链式队列
  • 原文地址:https://www.cnblogs.com/hiweibolu/p/6714779.html
Copyright © 2011-2022 走看看