info: { blogIcon: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogUser: 'OIerBoy', blogAvatar: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogStartDate: '2023-04-22', webpageTitleOnblur: '(o?v?)ノ Hi', webpageTitleOnblurTimeOut: 1000, webpageTitleFocus: '(*′?`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/blog_logo.webp", { enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 5, // 日间模式开始时间,整数型,24小时制 nightHour: 19 // 夜间模式开始时间,整数型,24小时制 } } },

莫比乌斯函数及反演学习笔记

前置知识

1. 艾佛森括号:
[P]={1(if P is true)0(otherwise)
2. ab 表示 ab 的因子
3. 整除分块:i=1nNi
4. p 没有特殊说明时表示质数
5. P 表示质数集,Z 表示整数集。
6. 常见的函数:

  • 常函数:1(x)=1
  • 单位元函数:ϵ(x)=[x=1]
  • 恒等函数:Idk(x)=xk
  • 因子函数:d(x)=ix1
  • 因子和函数:σ(x)k=ixik
  • 欧拉函数:φ(x)=i=1x[gcd(i,x)=1]

函数

数论函数

数论函数指一类定义域是正整数,值域是一个数集的函数。有:

  • (f+g)(x)=f(x)+g(x)
  • (xf)(n)=xf(n)

积性函数

当数论函数 f 对于 gcd(n,m)=1 有:

f(nm)=f(n)f(m)

则数论函数 f 为积性函数。
例如:d(x),φ(x)

完全积性函数

当积性函数 f 对于 gcd(n,m)1 仍有:

f(nm)=f(n)f(m)

则积性函数 f 为完全积性函数。
例如:ϵ(x),idk(x)

积性函数的实现

那么,积性函数像下面的 φ,μ 都是非常有用的东西,当然还有更多的积性函数,那么我们该如何去线性求出积性函数呢。
我们需要通过想欧拉筛筛质数的方式来快速筛出积性函数。
比如我们现在要筛积性函数 f,那么我们就需要快速的得到它的 f(1),f(p),f(pt)
我们需要先对每一个 i 进行唯一分解 i=1kpiti

  • p<p1,gcd(p,i)=1 时,则 f(ip)=f(i)×f(p)
  • p=p1 时,我们先记 lowi 表示 p1t1,则 f(ip)=f(ilowi)f(lowi×p)

这样我们就可以不重不漏的筛出函数 f 了。

void init(ll n){
    isp[1]=low[1]=1;
    f[1]=对1直接定义;
    for(ll i=2;i<=n;i++){
        if(!isp[i]) low[i]=p[++cnt]=i,f[i]=对质数直接定义;
        for(ll j=1;j<=cnt&&i*p[j]<=n;j++){
            isp[i*p[j]]=1;
            if(i%p[j]==0){
                low[i*p[j]]=low[i]*p[j];
                if(low[i]==i)
                    f[i*p[j]]=对质数的若干次幂进行定义(一般由f[i]递推);
                else
                    f[i*p[j]]=f[i/low[i]]*f[low[i]*p[j]];
                break;
            }
            low[i*p[j]]=p[j];
            f[i*p[j]]=f[i]*f[p[j]];
        }
    }
}

狄利克雷卷积 (dirichlet)

定义两个函数 f(n)g(n) 的狄利克雷卷积 (fg)(n) 其中 为卷积符号:

t(n)=i|nf(i)g(ni)ijf(i)g(j)

同时狄利克雷卷积满足以下一些性质:

  • fg=gf
  • (fg)h=f(gh)
  • fh+gh=(f+g)h
  • (xf)g=x(fg)
  • ϵf=f
  • 对于每一个 f(1)1 的函数 f 都有逆元 g,使得 fg=ϵ

那么对于一个 f(1)1 的函数 f 的逆元 g 该如何计算呢
我们只需要通过狄利克雷卷积的定义简单推导一下得到:

g(n)=1f(1)([n=1]in,i1f(i)g(ni))

这样就有:inf(i)g(ni)=f(1)g(n)+in,i1=[n=1]=ϵ

欧拉函数 (Euler)

定义

欧拉函数用 φ 表示,定义:

φ(n)=i=1n[gcd(i,n)=1]

解释:φ(n) 表示 1n 中与 n 互质的数的个数。

公式

先设 n=i=1kpiti,则有:

φ(n)=ni=1k(11pi)

证明:
我们先假设 nN+ 只存在质因子 p,q
考虑容斥,与 n 互质的数就是所有数减去 p,2p,,np,q,2q,,nq
同时根据容斥原理,需要补回 pq,2pq,,npq
φ(n)=nnpnq+npq=n(11p)(11q)
那么同理,当 n=i=1kpiti 时,有:

φ(n)=n(11p1)(11p2)(1npk)=ni=1k(11pi)

积性函数

函数 φ 满足 φ(nm)=φ(n)φ(m)   (gcd(n,m)=1)
φ 为积性函数。

证明:
n=i=1kpiai,m=i=1tqibi   (gcd(n,m)=1)

φ(nm)=nmi=1k(11pi)j=1t(11qj)=ni=1k(11pi)mj=1t(11qj)=φ(n)φ(m)

性质

dnφ(d)=nφ1=Id

证明:
f(n)=dnφ(d)。则由于:
f(n)f(m)=inφ(i)jnφ(j)=dnmφ(d)=f(nm)
可以得到 f(n) 为积性函数。
n=i=1kpiti
而对于 f(pc)=i=1cφ(pi)=i=1cpipi1=pc
f(n)=i=1kf(piti)=i=1kpiti=n

实现

我们可以通过线性筛筛质数的时候是顺便就把欧拉函数筛出来。

void Euler(int n){
    phi[1]=1;
    for (int i=2;i<=n;i++){
        if (!isp[i])primes.push_back(i),phi[i]=i-1;
        for(auto p:primes){
            if(p*i>n)break;
            isp[p*i]=1;
            if (!(i%p)){
                phi[p*i]=phi[i]*p;
                break;
            }else phi[p*i]=phi[p]*phi[i];
        }
    }
}

莫比乌斯函数 (Möbius)

定义

莫比乌斯函数用 μ 表示,定义:

μ(x)={1x=10pZ,p2x(1)ki=1kpi(1i,jj,pipj)

解释一下对 μ(x) 的定义:

  • x=1 时,μ(x)=1
  • x 含有任何的质因子的幂次 2μ(x)=0
  • x=i=1kpi,且所有 pi 的互不相同时,μ(x)=(1)k

性质

只知道莫比乌斯函数的定义还远远不够,我们还需要了解一下他的性质:

  • nN+,dnμ(d)=[n=1],μ1=ϵ

证明:

n=1 时,d|n=μ(1)=1=[n=1]

n>1 时,我们记 n=i=1kpiti
ti,ti>1 时,μ(n)=0
ti,ti=1 时,对于 μ(d)=(1)r 这样的存在 Ckr 个。
dnμ(d)=Ck0+Ck1+Ck2++(1)kCkk=i=0k(1)iCki
由二项式定理:(x+y)n=i=0nCnixiyni
dnμ(d)=i=0k(1)iCki=(1+1)n=0

  • dnμ(d)d=φ(n)n

证明:
dnμ(d)d=dnμ(d)ndn=dnμ(d)Id(nd)n=μ(n)Id(n)n
根据 φ1=Idφ1μ=μIdφϵ=μId
dnμ(d)d=μ(n)Id(n)n=φ(n)n

实现

和欧拉函数一样,也可以在筛质数的时候顺便得到。

void getMu(int n){
    mu[1]=1;
	isp[0]=isp[1]=1;
    for(int i=2;i<=n;++i){
        if(!isp[i])mu[p[++cnt]=i]=-1;
        for(int j=1;j<=cnt&&p[j]*i<=n;++j){
            isp[i*p[j]]=1;
            if(!(i%p[j]))break;
            else mu[p[j]*i]=-mu[i];
        }
    }
}

莫比乌斯反演

当存在有两个函数 fg 满足:f(n)=d|ng(d)f=g1
则一定有:

g(n)=d|nf(n)μ(nd)g=fμ

证明:

f=g1fμ=g1μfμ=g

倍数形式:

g(n)=ndf(d)f(n)=ndμ(dn)g(d)

例题

1. P2522 Problem B
i=abj=cd[gcd(i,j)=k]

f(k)=i=1nj=1m[gcd(i,j)=k],g(n)=nkf(k)
则通过莫比乌斯反演的倍数形式可以得到: f(x)=xkμ(kx)g(k)
我们在考虑对于函数 g 的处理:
g(x)=xki=1nj=1m[gcd(i,j)=k]=i=1nj=1m[xgcd(i,j)]=i=1nxj=1mx[1gcd(i,j)]=nxmx
我们在将函数 g 带回函数 f,同时枚举 kx 记为 t
f(x)=t=1min(n,m)μ(t)ntxmtx
那么对于最后的答案我们只需要一个简单的容斥:
ans=i=1bj=1d[gcd(i,j)=k]i=1a1j=1d[gcd(i,j)=k]i=1bj=1c1[gcd(i,j)=k]+i=1a1j=1c1[gcd(i,j)=k]
通过上的函数 f,g 带入即可,通过整除分块可以得到时间复杂度 O(n)

posted @   OIerBoy  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示