• 学习笔记 莫比乌斯反演简单整理


    写在卸载之前

    正在数论只会抄题解的道路上越行越远

    正式开始

    1.迪利克雷卷积

    1)定义新运算(*)

    注意这里(*)不是乘法

    (h,f,g)都是函数名称

    定义 (h=f*g)

    [h=f*g=sum_{d|n}f(d)g(frac{n}{d})=sum_{d|n}f(frac{n}{d})g(d) ]

    2)介绍几个函数

    (a(x)):对于任意(x) 都有(a(x)=1)

    (b(x)):对于任意(x) 都有(b(x)=x)

    (e(x)):也被称之为单位元函数 对于任意(x) 都有(e(x)=[x=1])

    乘法存在逆元 迪利克雷卷积也存在逆元

    3)逆元

    如果对于函数(f)存在

    [f*g=e ]

    那么我们就认为g为f的逆元

    2.莫比乌斯反演

    首先介绍一个函数 莫比乌斯函数(μ)

    ta是(a(x)=1)函数的逆元

    也就是$$μ*a=e$$

    我们使用迪利克雷卷积$$μ*a=sum_{d|n}μ(d)a(frac{n}{d})=sum_{d|n}μ(d)=[n=1]$$

    我们可以发现 μ的取值就是

    [μ(n)=egin{cases} 1,n=1\ 0,存在一个平方数是n的因子\ (-1)^m,n存在m个质因子\ end{cases} ]

    当然 (μ)也是一个积性函数

    可以使用线性筛求解

    int mul[N],prime[N];
    bool mark[N];
    
    mul[1]=1;
    for(int i=2;i<=n;++i)
    {
          if(!mark[i]) {prime[++tot]=i;mul[i]=-1;}
          for(int j=1;j<=tot&&prime[j]*i<=n;++j)
          {
                mark[prime[j]*i]=1;
                if(i%prime[j]==0)
                {
                      mul[prime[j]*i]=0;
                      break;
                }
                else mul[prime[j]*i]=-mul[i];
          }
    }
    

    我们接下来来具体化一个式子

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

    先枚举了i 再枚举i的所有约数 等于先枚举d再枚举[1,n]范围内的所有倍数

    等价于$$sum_{d=1}^{n}lfloor{frac{n}{d}} floorμ(d)$$

    从而我们得到了两个结论

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

    [sum_{i=1}^{n}sum_{d|i}μ(d)=sum_{d=1}^nlfloor{frac{n}{d}} floorμ(d) ]

    我们再来看看这个式子

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

    我们使用结论1

    [sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}μ(d)\ =sum_{i=1}^nsum_{j=1}^msum_{d|i}sum_{d|j}μ(d)\ =sum_{i=1}^nsum_{d|i}sum_{j=1}^msum_{d|j}μ(d) ]

    使用结论2

    [sum_{i=1}^nsum_{d|i}sum_{j=1}^msum_{d|j}μ(d)\ =sum_{d=1}^nlfloor{frac{n}{d}} floorsum_{d=1}^mlfloor{frac{m}{d}} floorμ(d)\ =sum_{d=1}^{min(n,m)}lfloor{frac{n}{d}} floorlfloor{frac{m}{d}} floorμ(d) ]

    也就是

    [sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}μ(d)\ =sum_{d=1}^{min(n,m)}lfloor{frac{n}{d}} floorlfloor{frac{m}{d}} floorμ(d) ]

    这个作为结论3

    有了这三个结论

    现在我们来做一道板子题

    【P2398 GCD SUM】

    [sum_{i=1}^nsum_{j=1}^ngcd(i,j)\ =sum_{d=1}^ndsum_{i=1}^nsum_{j=1}^n[gcd(i,j)=d]\ =sum_{d=1}^ndsum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{n}{d} floor}[gcd(i,j)=1] ]

    使用结论3 也就是

    [sum_{d=1}^ndsum_{t=1}^{lfloorfrac{n}{d} floor}μ(t){lfloorfrac{lfloorfrac{n}{d} floor}{t} floor}^2 ]

    具体代码的话 【点我领取代码】

  • 相关阅读:
    中国MOOC分数——Java
    axios的封装和使用
    ModelViewSet里的过滤、排序、分页、序列化设置
    Django和DjangoDRF的区别
    RESTFUL风格
    MVT和MVC的个人理解
    HTTP请求简单理解
    虚拟机创建Django项目并创建APP
    python列表元素添加的几种方法以及差异总结
    python时间格式
  • 原文地址:https://www.cnblogs.com/LovToLZX/p/14327862.html
Copyright © 2020-2023  润新知