zoukankan      html  css  js  c++  java
  • 莫比乌斯函数&&莫比乌斯反演学习笔记

    蒟蒻刚开始学莫比乌斯[懵比钨丝]反演x

    开始反演之前先解释一下莫比乌斯函数的定义?

    莫比乌斯函数$μ$ 定义如下

    $μ(n)$=1{$n=1$}

    $μ(n)$=${-1}^{k}${$n$=$p_1p_2p_3p_4....p_k$}

    $μ(n)$=$0${$otherwise$}

    文字定义就是 如果一个数字是一个没有平方因子的数字 那么它的莫比乌斯函数就是$(-1)^k$ $k$定义为因子个数

    如果$n$是$1$ 函数值为$1$ 

    其他情况 函数值为$0$

    莫比乌斯函数的性质:

    1、莫比乌斯函数是一个积性函数

    $prove$

    这个应该挺显然的...? 

    然后我们知道线性筛可以计算积性函数 于是我们就可以线性筛莫比乌斯函数

    附上代码:

    mu[1]=1;
        for (int i=2;i<=n;i++)
         {
             if (!IsPrime[i]){
             Index++;
             Prime[Index]=i;
             mu[i]=-1;
            }
        for (int j=1;j<=Index&&i*Prime[j]<=n;j++)
          {
             IsPrime[i*Prime[j]]=true;
              if (i%Prime[j]==0)
                 break;
            else 
            mu[i*Prime[j]]=-mu[i];
          }
         }

    2、$sum_{d|n}μ(d) =[n==1]$

    $prove$

    只考虑$μ(d)==1$的情况

    设$n=p_1p_2p_3p_4...p_k$

    $d$的质因子个数是$j$的方案数$C_{k}^{j}$

    也就是说 $sum_{d|n}μ(d)$=$C_{k}^{0}-C_{k}^{1}+C_{k}^{2}...+(-1)^{m}C_{k}^{k}$

    根据二项式定理 这东西等于$0$

    开始反演?

    莫比乌斯反演的公式是:

    形式一:

    $F(n)$=$sum_{d|n}f(d)$

    则有$f(d)$=$sum_{d|n}μ(frac{n}{d})F(d)$=$sum_{d|n}F(frac{n}{d})μ(d)$

    形式二:
    $F(n)$=$sum_{n|d}f(d)$

    则有$f(n)$=$sum_{n|d}μ(frac{d}{n})F(d)$

    在很多时候我们能比较容易地求出$F(n)$ 但求不出$f(n)$的时候 就可以用这个东西了w

    $prove$

    我不会啊 咕咕咕

    举个例子?

    给定整数n和k 求在[1..n]之间有多少对$(i,j)$ 满足$gcd(i,j)==k$

    做法一:

    可以发现 题目是在求解形如$sum_{1<=i<=n}sum_{1<=j<=n}[gcd(i,j)==k]$

    然后我们可以除一下

    变成$sum_{1<=i<=frac{n}{k}}sum_{1<=j<=frac{n}{k}}[gcd(i,j)==1]$

    根据莫比乌斯函数的性质2

    变成$sum_{1<=i<=frac{n}{k}}sum_{1<=i<=frac{n}{k}}sum_{d|gcd(i,j)}μ(d)$

    考虑把枚举因数变成枚举倍数 我们枚举d

    则有:$sum_{d=1}^{n}μ(d)sum_{i=1}^{n}[d|i]sum_{j=1}^{n}[d|j]$

    也就是说 后面两个式子统计的其实是$n$中有多少个数字是$d$的倍数

    显然 答案是$frac{n}{d}$

    所以 答案就变成了$sum_{d=1}^{n}μ(d)frac{n}{d}frac{n}{d}$

    然后数论分块瞎搞一下就行了233

    做法二:

    既然要大力反演就要构造出合适的$F$和$f$

    考虑怎么构造

    答案式$f(x)$=$sum_{1<=i<=n}sum_{1<=j<=n}[gcd(i,j)==k]$

    定义$F(d)$=$sum_{1<=i<=n}sum_{1<=j<=n}sum_{d}[d|gcd(i,j)]$

    $F(d)$=$sum_{1<=i<=n}sum_{d|i}f(i)$

    然后我们有了这个式子之后 就可以大力根据形式二反演了

    $f(n)$=$sum_{n|d}F(d)μ(frac{d}{n})$

    只要枚举到n就行了

    $F(d)$=$sum_{1<=i<=n}sum_{1<=j<=n}sum_{d}[d|gcd(i,j)]$

    其实就是在$n$的范围内 有多少对$gcd(i,j)$是$d$的倍数

    就直接算因数

    是$frac{n}{d}$

    然后发现我们要求解$f(1)$

    $f(1)$=$sum_{1|d}F(d)μ(frac{d}{1})$

    即$f(1)$=$sum_{d}F(d)μ(d)$

    代入 $f(1)$=$sum_{d}frac{n}{d}frac{n}{d}μ(d)$

    然后得到了一样的答案233

  • 相关阅读:
    管理反思(阶段)
    应用软件系统程序员的三个立面
    再优秀那么一点点
    TCP相关时延
    go wiki整理1
    慢就是快
    给自己一点机会
    竞争
    go mem
    币圈再次过年
  • 原文地址:https://www.cnblogs.com/si--nian/p/11604640.html
Copyright © 2011-2022 走看看