Möbius 反演注记

2021 年写的:数论基础模板库(不保证正确性) ; Mobius 反演(内含 μ 作容斥系数)

基本理论基础

规定素数集记做 P .

gcd(i,j)=1 可以记做 ij .

数论函数

数论函数是定义域为 N,陪域为 C 的函数 .

注意重点是定义域为 N .

线性筛

理论上任何积性函数都可以线性筛,线性筛需要:

  • 素数处的取值
  • qp 的最小素因子,已知 f(p),f(q),求 f(pq) .

一般应用:筛素数,筛 φ,筛 μσk .

实际上基于质因数分解可以只用素数处的取值求出所有取值(例:固定指数幂) .

拉一份淳朴的板子过来(筛素数,欧拉函数和 Mobius 函数)

bool notprime[N];
int phi[N], mu[N];
vector<int> plist;
inline void linear_sieve(int n)
{
    notprime[1] = true; phi[1] = mu[1] =1 ;
    for (int i=2; i<=n; i++)
    {
        if (!notprime[i]){plist.emplace_back(i); phi[i] = i-1; mu[i] = -1;}
        for (auto x : plist)
        {
            int now = i*x;
            if (now > n) break;
            notprime[now] = true;
            if (!(i%x)){phi[now] = phi[i] * x; mu[now] = 0; break;}
            else{phi[now] = phi[i] * phi[x]; mu[now] = mu[i] * mu[x];}
        }
    }
}

Mobius 反演

Möbius 太难写了,不如写 Mobius .

既然这篇叫莫比乌斯反演,我们就默认大家都会莫比乌斯反演了 .

复习一下:

Dirichlet 卷积的莫比乌斯反演:

f=g1g=fμ

特殊形式:

  • 标准型:f(n)=dng(d)g(n)=dnf(nd)μ(d) .
  • 直接推论:f(n)=d=1Tng(di)g(n)=d=1Tnf(di)μ(d)T 是常数 .

Dirichlet 卷积

我们一般见到的 Dirichlet 卷积是不是这样的:

(fg)(n)=dnf(n)g(nd)

但多项式技术中卷积一般是不是长这样

h(n)=ij=nf(i)g(j)

h 就是 f,g 的卷积,然后 是随便一个运算,特殊形式:

  • 如果 是加,那么就是通常意义上的 卷积 .
  • 如果 是位运算,那么就是一般叫的 位运算卷积 .
  • 如果 是乘,然而 f,g 是数论函数(定义域为 N),所以 i,j 必然是整数,这就是我们通常意义上的 Dirichlet 卷积 .

写下来这个形式:

(fg)(n)=ij=nf(i)g(j)

其中 i,j 都是整数 .

交换律,结合律不言自明 .

常见卷积:

  • μ1=ε(即 μ1 的 Dirichlet 卷积逆)
  • φ1=id(欧拉反演) .
  • μid=φ .

你看第一个东西,Mobius 反演是不是那个玩意的直接推论?(f=g1 两边同时卷 μ).

Dirichlet 卷积的计算:枚举因子然后累加贡献,O(nlogn) .


然而 Dirichlet 卷积是不是卷积啊,我们普通卷积有 FFT,位运算卷积有 FMT/FWT,然而 Dirichlet 卷积有没有一个幸运函数使得满足卷积定理呢?

其实是有的,可以了解一些 贝尔级数 / 狄利克雷生成函数 相关知识,限于篇幅 & 笔者能力这里就不说了 .

数论分块 / 整除分块

整除只有根号种本质不同的取值,于是可以压到一起 .

就比如你算一个 i=1nniF(i),代码大概长这样:

ll Koishi(int n)
{
    ll ans = 0;
    int l=1, r;
    while (l <= n)
    {
        r = n / (n / l);
        ans += (F(r) - F(l-1)) * (n / l);
        l = r + 1;
    } return ans;
}

上面是拉的 OI Wiki 上的,实际上可以写 for 循环 .

然后多维整除分块只需要取 min,具体找个人的贺下来就好了 .

如果 F 可以 O(1) 计算,那么复杂度 O(n),即 O(n1/2) .

注意算复杂度不能把 O(n1/2) 直接乘上算 F 的复杂度,整除分块的复杂度是比较难分析的,反正我不会 .

特殊:

  • 整除分块套杜教筛:O(n2/3) .
  • 整除分块套整除分块:O(n3/4) .

拆函数

贺的 APJ 的 .

对于任何 i,j 都成立,不管互不互素 .

φ(ij)=φ(i)φ(j)φ(gcd(i,j))gcd(i,j)

μ(ij)=μ(i)μ(j)[gcd(i,j)=1]

d(ij)=d1id2j[gcd(d1,d2)=1]

时间复杂度分析

i[1,n]1i=O(nlogn)

i[1,n]P1i=O(nloglogn)

基本形式

GCD 形

i=1nj=1mg(gcd(i,j))

设函数 f 使得 f1=g .

一些基本推导:

i=1nj=1mg(gcd(i,j))=i=1nj=1mdgcd(i,j)f(d)=d=1ni=1ndj=1mdf(d)=d=1nndmdf(d)

整除分块,要求 f 可以快速求前缀和 .

根据 Mobius 反演,我们把 g 卷上 μ 就是 f 了,可以 O(nlogn) .

如果空间不够,那么因为这个卷积的形式可以杜教筛求前缀和(当然整除分块套杜教筛是 O(n2/3) 的,比卷出来劣)

然而展开 f=gμ 然后交换两个 就可以 Dirichlet 后缀和 做到 O(nloglogn) .

也有一种 非常牛逼的做法 可以直接 O(nloglogn) 卷 .

这个可以推广到 fg=h 形,但是没啥用,大概可以推出来整除分块套杜教筛或者三个整除分块套起来的形式,读者可以试试 .

这个是不是可以轻易推广到多个 .

GCD 形其实非常常见 .

  • YY的GCDg(n)=[nP](需要开 -O2) .
  • 数表g(n)=d(n)[d(n)a](不能直接用上面的做法(杜教筛或许能过?没写过 QwQ)).
  • 于神之怒加强版g(n)=nk .

万能

i=1nj=1mf(i)g(j)h(gcd(i,j))

https://www.luogu.com.cn/blog/qwaszx/ru-men-fan-yan-tao-lu

这个牛逼东西看到的比较晚 QwQ .

一大堆题都是长个样子 .

Prod 的莫比乌斯反演

来源 .

定义 (fg)(n)=dnf(d)g(nd) .

则有 (fg)h=f(gh),其中 是 Dirichlet 卷积

(?)

然后就可以得到 f=g1g=fμ .

注意 没有交换律

然后该咋做咋做,GCD 形啥的都可以套 .

预处理幂,这个卷也可以 O(nlogn) 算 .

然而 Prod 的整除分块有些变化,注意 .

正常例题

省略:数据范围、模数 .

不加注释的技法:

  • 基本形式
  • 按定义拆函数
  • 按常见卷积拆函数(例如 n=dnφ(d)[n=1]=dnμ(d)
  • 加一个 枚举某个变量(一般是 gcd
  • 交换求和号
  • 小学就学过的平凡算术 .

YY 的 GCD

i=1nj=1n[gcd(i,j)P]

GCD 形,函数 p(x)=[xP] 可以线性筛,暴力卷 μ 即可 .

数表

f(x)=[σ1(c)a]σ1(c),求

i=1nj=1nf(gcd(i,j))

每次询问给一个 a .

假设没有 a 的限制,那么我们要求的就是

i=1nj=1nσ1(gcd(i,j))

GCD 形,令 g=σ1μ,那么原式变成

d=1nndmdg(d)

注意这里是要求 g 可以快速求前缀和 .

牛逼的地方来了 .

然后因为有 a 这个限制,所以考虑把询问离线下来,然后排序叠加贡献 .

你看这个 g 的形式是不是 g(n)=dnσ1(d)μ(nd),因为我们限制的是 σ1(d) 的值,所以用一个指针跳就好了 .

相当于单点加,前缀和,可以树状数组,没了 .

details: 因为取模 231 所以可以 int 自然溢出最后按位与 2311(此处是 UB,但是确实好用)

DZY Loves Math

定义 f(n)n 所含质因子的最大幂指数,求

i=1nj=1nf(gcd(i,j))

GCD 形,然而暴力卷会 TLE……吗?

开个 -O2 直接过了?????

?????????????????

有正经做法推出来一个 fμ 的通项,不懂 .

约数个数和

i=1nj=1md(ij)

因为是当草稿写的,可能有冗余 .

不妨令 nm 吧 .

一些平凡的转化,用到的都是基本 Trick .

i=1nj=1md(ij)=i=1nj=1md1id2j[gcd(d1,d2)=1]=d1=1nd2=1mi=1nd1j=1md2[gcd(d1,d2)=1]=d1=1nd2=1mnd1md2[gcd(d1,d2)=1]=i=1nj=1mnimjdgcd(i,j)μ(d)=d=1ni=1ndj=1mdnidmjdμ(d)=d=1nμ(d)i=1ndj=1mdnidmjd

发现要处理后面那个玩意了,令 F(d)=i=1ndj=1mdnidmjd .

然后发现 i,j 差不多是独立的,于是可以提出来:

F(d)=(i=1ndnid)(j=1mdmjd)

(当然这里下标比较无聊,你愿意改成 i 也行)

于是原式就类似 i=1nP(i)Q(ni)R(mi) 这种形式,整除分块即可 .

然而整除分块套整除分块是 O(n3/4) 的,于是复杂度是 O(Tn3/4),算出来大概是 1.5e8 .

数字表格

i=1nj=1mFgcd(i,j)

F 是 Fibonacci 数列 .

lnexp,取底数 =2 做 BSGS .

Prod 形的 GCD .

于神之怒加强版

i=1nj=1m(gcd(i,j))k

GCD 形 .

线性筛是啥玩意?难道不是暴力就完了吗??

O(nloglogn+Tn) .

jzptab

i=1nj=1mlcm(i,j)

花了大概一个公共自习推出来力 /cy .

不妨令 nm .

i=1nj=1mlcm(i,j)=i=1nj=1mijgcd(i,j)=d=1ndi=1ndj=1mdij[gcd(i,j)=1]=d=1ndi=1ndj=1mdiejeegcd(i,j)μ(e)=d=1nde=1ndi=1ndej=1mdeije2μ(e)=d=1nde=1ndμ(e)e2i=1ndej=1mdeij=d=1nde=1ndμ(e)e2S(nde)S(mde)

其中 S(x)=i=1xi=x(x+1)2 .

用到了一个小结论:npq=npqAbout it .

然后后面可以线性预处理,O(Tn1/2) .

模数是 1e8+9!!!模数是 1e8+9!!!模数是 1e8+9!!!模数是 1e8+9!!!模数是 1e8+9!!!

一个人的数论

给定 n,k,求

fk(n)=i=1n[gcd(i,n)=1]ik

109+7 取模 .

数据范围及输入细节见 原题面 .

首先平凡莫反:

fk(n)=i=1nikdgcd(i,n)μ(d)=dnμ(d)i=1n/d(id)k=dnμ(d)dki=1n/dik

然后后面是不是自然数幂和?众所周知这玩意是 k+1 次多项式,设 p 次项系数为 Fp,这个玩意咋求后面再说 .

于是可以继续化

fk(n)=dndkμ(d)i=0k+1Fi(nd)i=i=0k+1dndkμ(d)Fi(nd)i=i=0k+1Finidnμ(d)dni

后面显然就是 1(μIdni),必然是积性函数 .

然后因为给出的质因数分解式,所以我们可以暴力求出所有素数幂处的取值然后乘起来即可 .

然而 μ 接收到平方因子就变成 0 了,于是只需求出素数处取值,暴力即可 .

然后前面的 n 可以直接对 109+7 取模 .


现在来说说 F 怎么求 .

如果你插值你就 naive 了,因为插值最快 O(klog2k),如果写最 simple 的拉格朗日插值还是 O(k2) 的 .

我们可以用伯努利数求这个玩意,完全可以做到 O(klogk),只需要一次求逆!!!

然而模数是 109+7,求逆会瞬间变得巨大多难写 . 但是递推伯努利数也比插值不知道高到哪里去了 .

似乎 O(k3) 高斯消元能过

posted @   yspm  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示