zoukankan      html  css  js  c++  java
  • 莫比乌斯反演-理论

    $Mobius$ $inversion$ $formula$

      以后的博客都改用楷体了,还是楷体好看.

      首先既然要学莫比乌斯反演,我们就应该先知道莫比乌斯反演名字的来源,莫比乌斯函数是根据$19$世纪的数学家奥古斯特·莫比乌斯命名的.

      接下来看一下一个叫做莫比乌斯函数的东西:

      $mu(n)= left{egin{matrix}1,n=1 \ (-1)^k,n=prod_{i=1}^k p_i \0,others end{matrix} ight.$

      还有一些小的知识点:

      数论函数:定义域为$N$的函数.举几个例子:

        1. $varphi (n)=sum_{i=1}^n[(i,n)==1]$

        2. $id(n)=n$

        3. $1(n)=1$

        4. $d(n)=sum_{d|n}1$

        5. $sigma (n)=sum_{d|n}d$

        6. $varepsilon (n)=[n=1]$

    ​  积性函数:对于任意$(a,b)=1$,满足$f(ab)=f(a) imes f(b)$

      完全积性函数:$f(a,b)=f(a) imes f(b)$

    ​  来尝试一下运用: 

      $mu(n)$ 和 $varphi(n)$ 都是积性函数,所以都可以线性筛:

      
     1 # include <cstdio>
     2 # include <iostream>
     3 # define R register int
     4 
     5 using namespace std;
     6 
     7 const int maxn=100000;
     8 int phi[maxn],n,pri[maxn],vis[maxn],h;
     9 
    10 int main()
    11 {
    12     scanf("%d",&n);
    13     phi[1]=1;
    14     for (R i=2;i<=n;++i)
    15     {
    16         if(!vis[i])
    17             pri[++h]=i,phi[i]=i-1;
    18         for (R j=1;j<=h&&i*pri[j]<=n;++j)
    19         {
    20             vis[ i*pri[j] ]=1;
    21             if(i%pri[j]==0)
    22             {
    23                 phi[ i*pri[j] ]=phi[i]*pri[j];
    24                 break;
    25             }
    26             phi[ i*pri[j] ]=phi[i]*(pri[j]-1);
    27         }
    28     }
    29     for (R i=1;i<=n;++i)
    30         printf("%d ",phi[i]);
    31     return 0;
    32 }
    线性筛phi
      
     1 for (R i=2;i<=n;++i)
     2     {
     3         if(!vis[i])
     4             pri[++h]=i,mu[i]=1;
     5         for (R j=1;j<=h&&i*pri[j]<=maxn;++j)
     6         {
     7             vis[ i*pri[j] ]=1;
     8             if(i%pri[j]) break;
     9             mu[ i*pri[j] ]=-mu[i];
    10         }
    11     }
    线性筛mu

      下面是一些小证明,这次我决定把用到的结论全证一遍,因为随着时代的进步背板子题只能越来越少,而且现在时间也比较多.

      1.$sum_{d|n}mu(d)=varepsilon (n)$

      证明:

    ​  当$n=1$时显然是成立的.

    ​  首先对于 $n$ 分解质因数,得$n=prod_{i=1}^kp_i^{a_i}$

    ​  显然对于任意的$d|n$,$d=prod_{i=1}^kp_i^{b_i},b_i<=a_i$

      如果$max{b_i}>1$,则$mu(d)=0$,对答案不造成影响,所以不用考虑.

    ​  那么能够影响答案的 $d$ 必然满足任意质因子的次数最多等于 $1$ ,且都是在 $n$ 中出现过的质因子.

      枚举 $d$ 中含有的因子数量:

      $sum_{d|n}mu(d)=sum_{i=0}^k inom{k}{i} (-1)^k=sum_{i=0}^k inom{k}{i} (-1)^k1^{-k}=(-1+1)^k=0$

      

      2.$frac{varphi(n)}{n}=sum_{d|n}frac{mu(d)}{d}$

      证明:$varphi(n)=sum_{i=1}^n[(i,n)=1]$

    ​  $varphi(n)=sum_{i=1}^nsum_{d|(i,n)}mu(d)$

      变枚举约数为枚举倍数:

      $varphi(n)=sum_{d|n}mu(d)sum_{d|i}^n1$

      $varphi(n)=sum_{d|n}mu(d)frac{n}{d}$

      $frac{varphi(n)}{n}=sum_{d|n}frac{ mu(d) }{d}$

      这里好像不得不补充一点卷积的内容了.

      $h=(f imes g) ightarrow h(n)=sum_{d|n}f(d) imes g( frac{n}{d} )$

      显然$h(n)=sum_{d|n}g(d) imes f(frac{n}{d})$

      这就是著名的$Dirichlet$卷积.

      3.$id=varphi imes 1$

      ​证明:

      ​$varphi imes 1=sum_{d|n}varphi(d) imes 1(frac{n}{d})$

      $=sum_{d|n}varphi(d)$

      $=sum_{d|n}sum_{i=1}^d [(i,d)=1]$

      $=sum_{d|n}sum_{i=1}^d sum_{k|(i,d)} mu(k)$

      代入$(2)$中的结论:

      $=sum_{d|n}sum_{k|d}mu(k) imes id(frac{d}{k})$

      进行一番合式变换:

      $=sum_{d|n}sum_{k|d} mu (frac{d}{k}) imes id(k)$

      $=sum_{k|n}k sum_{d|frac{n}{k}} mu(d)$

      再运用一下$(1)$里面的结论,只有$frac{n}{k}=1$时,后面的合式等于一,此时前边 $k=n$ ,其余时间整个合式等于$0$.

      至于最后一步的合式变换为什么是对的:

      在上一步中,被放到 $mu$ 里面的那部分乘上 $k$ 是 $n$ 的一个因子.所以当我们转而枚举 $k$ 的时候,只需要$(k imes d)|n$,也就是$d|frac{n}{k}$.

      ​如果还是不理解就看看这个:

      例如$n=6$

      $d=1$ $mu(1) imes 1$

      $d=2$ $mu(2) imes 1+mu(1) imes 2$

      $d=3$ $mu(3) imes 1+ mu(1) imes 3$

      $d=6$ $mu(6) imes 1+mu(3) imes 2+mu(2) imes 3+mu(1) imes 6$

     

      好了,现在进入正题:

      $$f(n)=sum_ {d∣n}g(d)$$

      已知 $g$ 求 $f$ ...好像挺简单的,求单个最少可以做到$sqrt{N}$,多个可以$O(N)$.

      但是现在需要已知 $f$ 求 $g$ 了,怎么做?

      如果 $n$ 非常小,是可以高斯消元的.

      如果 $n$ 并不小呢?

      结论一、莫比乌斯因数反演:

      $$g(n)=sum_{d|n}mu(d) imes f(frac{n}{d})$$

      尝试证明一下:

      $sum_{d|n}mu(d) imes f(frac{n}{d})$

      $=sum_{d|n}mu(d)sum_{k|frac{n}{d}}g(k)$

      $ecause qk=frac{n}{d}$

      $ herefore qd=frac{n}{k}$

      $=sum_{k|n}g(k)sum_{d|frac{n}{k}}mu(d)$ 

      当且仅当$k=n$,第二个合式等于 $1$ ,其余时间等于 $0$.

      $=g(n)$

      

      结论二:若 $f(n)=sum_{d|n}g(d)$,则有 $g(n)=sum_{k|n}mu(frac{n}{k})f(k)$

      证明:

      $g(n)=sum_{i=1}^ng(i)sum_{k|frac{n}{i}}mu(k)$

      $g(n)=sum_{k|n}mu(k)sum_{i|frac{n}{k}}g(i)$

      $g(n)=sum_{k|n}mu(k)f(frac{n}{k})$

      $g(n)=sum_{k|n}mu(frac{n}{k})f(k)$

      结论三、做题时可以直接拿来用:

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

      因为莫比乌斯函数的性质1,且$i,j$的所有因子都是它们最大公约数的因子,可得:

      $sum_{i=1}^{n}sum_{j=1}^{m}sum_{d|i,d|j} mu(d)$

      现在开始插播一些套路们:

      套路一:枚举约数改为枚举倍数.由于合式之间是加起来相乘的方式,用乘法分配律化开后考虑每个约数的贡献.

      $sum_{d=1}^nmu(d)sum_{d|i}sum_{d|j}1$

      这个合式后面的部分可以算出来对吧...

      $sum_{d=1}^nmu(d)frac{n}{d}frac{m}{d}$

      这样以来式子就由$N^2logN$变成了$N$,但是还可以再优化一下,对后面的部分进行除法分块达到$sqrt{N}$,你可能会觉得这没有用...毕竟线筛的复杂度就已经不小了,但是优化一下是没有害处的~.比如说这里的莫比乌斯前缀和可以用杜教筛,洲阁筛等奇妙筛法进一步优化.更一般的情况是多组询问...

    ---shzr

  • 相关阅读:
    FileItem类的常用方法
    spring mvc(注解)上传文件的简单例子
    Linux下安装Tomcat服务器和部署Web应用
    防止表单重复提交的几种策略
    Rancher 2.0 学习目录
    Prometheus 学习目录
    k8s学习目录
    python之路——目录
    Mac OS X生成RSA公钥和私钥
    Django设置 DEBUG=False后静态文件无法加载解决
  • 原文地址:https://www.cnblogs.com/shzr/p/10013676.html
Copyright © 2011-2022 走看看