莫比乌斯函数与莫比乌斯反演

前言

这玩意无疑是高等数论Oier的必学玩意

身为一名准退役选手,数论一直不行,现在来亡羊补牢。。。似乎已经晚了

(latex)根本不会用qwq

感谢大佬的文章,写的很好。自己太菜

若有错误,欢迎指出

正文

  • 莫比乌斯函数(mu)

    这是反演的基础,本质上是容斥系数的函数。(不理解可以看gzy大佬的blog但大佬的文章太强,蒟蒻看不懂啊)

    (d=Pi_{i=1}^{k}p_i^{a_i})

    (mu(d)=left{egin{matrix} 1& d=1 \(-1)^k& max(a_i) =1 \ 0 & otherwise end{matrix} ight.)

  • (mu)的一些性质

    1.对于任意(nin N^+)(sum_ ext{d|n} mu(d) = [n=1])

    证明

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

    (ngeq2)

    (n=Pi_{i=1}^k {p_i}^{a_i})

    (a_igeq2)不用管就是0啦

    于是我们就是在(k)个质因数中选择(i)个组成(d)

    对于(i)为奇数时的贡献是(-1)

    对于(i)为偶数时的贡献是(1)

    (sum_{i=0}^{k} inom{k}{i}(-1)^i)=(sum_{i=0}^kinom ki(-1)^i1^{k-i})=((-1+1)^k)=(0)

    证毕

    2.对于任意(nin N^+)(sum_ ext{d|n}frac{mu(d)}d=frac{phi(n)}n)

    证明不会

    3.对于任意质数(p)(mu(p)=-1)

    由定义 (mu(p)=(-1)^1=-1)

  • 关于(mu)的求解

    因为(mu)是个积性函数,所以我们可以方便的用线性筛求解

    线性筛什么的,以后可能会填一填坑

    放一下代码

    int mu[N],pri[N],tot;
    bool npr[N];
    void getmu(int n)
    {
        memset(npr,0,sizeof npr);
        tot=0,mu[1]=1;
        for(int i=2;i<=n;++i)
        {
            if(!npr[i])pri[++tot]=i,mu[i]=-1;
            for(int j=1;j<=tot&&i*pri[j]<=n;++j)
            {
                npr[pri[j]*i]=1;
                if(i%pri[j])mu[i*pri[j]]=-mu[i];
                else break;
            }
        }
    }
    
  • 莫比乌斯反演

    这里是重点了qwq

    反演的用处在于有一个好求的函数(F(n)),通过它来求关于其约数或倍数(d)的函数(f(d))

    反演有两种形式

    1.约数形式

    (F(n) = sum_{d|n} f(d) ightarrow f(n)=sum_{d|n} mu(frac nd)F(d))

    2.倍数形式

    (F(n) = sum_{n|d} f(d) ightarrow f(n)=sum_{n|d} mu(frac dn)F(d))

  • 例题

    常见的应用求(sum_{i=1}^nsum_{j=1}^m[gcd(i,j)=1])

    洛谷P2257 yy的gcd

原文地址:https://www.cnblogs.com/LLCSBlog/p/10202582.html