• 莫比乌斯反演·学习记录


    莫比乌斯反演·学习记录

    cyw在6.8左右学的莫比乌斯反演,记录一下


    这个东西感觉不大好描述,我一开始也不知道这玩意能干嘛(其实现在也不知道)
    CYW认为,对关于一些因数/倍数关系进行操作的行为,可以用莫比乌斯反演来解决


    莫比乌斯函数

    这并不是什么高大上的东西,但是很有用
    对于 莫比乌斯函数 的定义是

    1. $d=1,mu(d)=1 $
    2. (d=prod_{k=1}^n p_k;(kin prime),mu(d)=(-1)^k)
      即数(d)可以被表示为若干互异素数相乘的形式(指数不超过(1)),此时函数值根据分解数量而定
    3. (Otherwise,mu(d)=0)

    当然了 它有一些性质

    • (mu)是积性函数,这是它可以通过线性筛求的必要条件
    • 对于正整数(n)(sum_{d|n}mu(d)=[n=1]),这是莫比乌斯反演中非常常用的一条性质
    • 对于正整数(n)(sum_{d|n}frac{mu(d)}{d}=frac{phi(n)}{n}),不过这个我还没用过
    • [mu imes id;=;phi ]

    ( imes)表示卷积,这里是常见狄利克雷卷积的一种,有的时候有奇效
    在公式里书写为

    [sum_{d|n}mu(frac{n}{d})*d=phi(n) ]

    贴一份线筛代码

    inline void getmiu(int n){
        memset(vis,0,sizeof(vis));
        mu[1]=vis[1]=1;
        for (int i=2;i<=n;i++){
            if (!vis[i]){pri[++cnt]=i;mu[i]=-1;}
            for (int j=1;j<=cnt&&(LL)i*pri[j]<=n;j++){
                vis[i*pri[j]]=1;
                if (i%pri[j]==0) break;else mu[i*pri[j]]=-mu[i];
            }
        }
    }
    

    PS:一些题目中要求(summu(d)),可以通过预处理来降低复杂度


    整除分块

    一个同样在莫比乌斯反演及一些计算中十分重要的东西

    [sum_{i=1}^nlfloorfrac{n}{i} floor ]

    这个东西暴力算是(O(N))的,容易发现,(lfloorfrac{n}{i} floor)至多只有(sqrt{n})种取值,可以对每种取值的个数进行计算,再乘上对应的i,复杂度(O(sqrt{n}))

    for (int l=1,r;l<=n;l=r+1){   //可能会用到(for LL l=1,r;...)
    	r=n/(n/l);
    	ans+=(LL)(n/l)*(r-l+1); //注意在部分大运算前加(LL)或"1ll*",避免炸int
    }
    

    好的,那么所有的前言:莫比乌斯函数,整除分块都讲完了,可以开始我们的正题
    莫比乌斯反演


    莫比乌斯反演

    莫比乌斯反演,主要指满足这样条件的函数。

    [F(n)=sum_{d|n}f(d) ]

    则有

    [f(n)=sum_{d|n}mu(d)f(frac{n}{d}) ]

    //我觉得(frac{n}{d})加不加(lfloor floor)无所谓,因为(d|n).

    还有一种反演形式:

    [F(n)=sum_{n|d}f(d) ]

    则有

    [f(n)=sum_{n|d}mu(frac{d}{n})f(d) ]

    下面给出第一个的证明

    [sum_{d|n}mu(d)f(frac n d) ]

    [=sum_{d|n}mu(d)sum_{i|frac n d}f(i) ]

    [=sum_{i|n}f(i)sum_{d|frac n i}mu(d) ]

    [=f(n) ]

    (其实这个证明蛮鬼畜的)

    然后这个反演就没了,接下来会写一些例题进行具体分析

    l例题

    公约数的和
    数字表格

  • 相关阅读:
    页面自动打印
    水晶报表安装问题
    c#中重写属性
    水晶报表无法找到数据源问题
    SQL Server2000安装提示数据源配置错误解决方案
    由C/C++中的结构体包含数组引申到C/C++堆栈
    自写缓存类
    C语言fread和fwrite的例子
    C语言生成DLL供C#调用
    C语言操作文件总结
  • 原文地址:https://www.cnblogs.com/ugly-CYW-lyr-ddd/p/9180442.html
Copyright © 2020-2023  润新知