Caiwen的博客

卷积与反演

2022-08-11 06:02:00

狄利克雷卷积

(fg)(n)=dnf(d)g(nd)dn的因子)(f\ast g)(n)=\sum_{d|n}f(d)g(\frac{n}{d}) (d为n的因子)

称为 f(x)f(x)g(x)g(x) 在n上的卷积

有以下性质

  1. fg=gff\ast g=g\ast f

  2. (fg)h=f(gh)(f\ast g)\ast h=f\ast (g\ast h)

  3. (f+g)h=fh+gh(f+g)\ast h=f\ast h + g \ast h

  4. μI=ε\mu \ast I=\varepsilon
    ε(n)=[n=1]\varepsilon(n)=[n=1] (仅在n=1时为1,否则为0))
    I(n)=1I(n)=1

  5. φI=id\varphi \ast I=id
    id(n)=nid(n)=n

  6. μid=φ\mu \ast id=\varphi

其中上面的第四五个性质最为常用,我们有比较直观的形式

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

f(x)=df(x)φ(d)f(x)=\sum_{d|f(x)}\varphi(d)

反演

与gcd有关的问题常用莫比乌斯反演和欧拉反演

莫比乌斯反演

有判断函数常用莫比乌斯反演

i=1nj=1m[gcd(i,j)=k]\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]

变形

i=1[nk]j=1[mk][gcd(i,j)=1]\sum_{i=1}^{\left [ \frac{n}{k} \right ] } \sum_{j=1}^{\left [ \frac{m}{k} \right ] } [gcd(i,j)=1]

由莫比乌斯反演可得

i=1[nk]j=1[mk]dgcd(i,j)μ(d)\sum_{i=1}^{\left [ \frac{n}{k} \right ] } \sum_{j=1}^{\left [ \frac{m}{k} \right ] }\sum_{d|gcd(i,j)}\mu (d)

dgcd(i,j)d|gcd(i,j),则可推出 did|idjd|j

所以交换求和顺序

d=1[nk]μ(d)i=1[nkd]j=1[mkd]\sum_{d=1}^{\left [ \frac{n}{k} \right ] }\mu (d)\sum_{i=1}^{\left [ \frac{n}{kd} \right ] } \sum_{j=1}^{\left [ \frac{m}{kd} \right ] }

d=1[nk]μ(d)[mkd][nkd]\sum_{d=1}^{\left [ \frac{n}{k} \right ] }\mu (d)\left [ \frac{m}{kd} \right ] \left [ \frac{n}{kd} \right ]

欧拉反演

gcd求和常用欧拉反演

i=1nj=1mgcd(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)

由欧拉反演可得

i=1nj=1mdgcd(i,j)φ(d)\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|gcd(i,j)} \varphi (d)

交换求和顺序

d=1nφ(d)i=1[nd]j=1[md]\sum_{d=1}^{n} \varphi (d) \sum_{i=1}^{\left [ \frac{n}{d} \right ] } \sum_{j=1}^{\left [ \frac{m}{d} \right ] }

d=1nφ(d)[nd][md]\sum_{d=1}^{n} \varphi (d) \left [ \frac{n}{d} \right ] \left [ \frac{m}{d} \right ]

杜教筛

i=1nf(i)=s(n)\sum_{i=1}^{n}f(i)=s(n)

其中 f(i)f(i) 为积性函数

再找一个积性函数 gg ,考虑狄利克雷卷积

i=1n(fg)(i)\sum_{i=1}^{n}(f \ast g)(i)

i=1ndif(d)g(id)\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})

为了更好地处理我们有 id=k\frac{i}{d}=k 考虑主要枚举k,k[1,n]k\in \left [ 1,n \right ] ;再枚举d,d[1,nk]d\in \left [ 1,\frac{n}{k} \right ] ,然后就有下面的变形

d=1ng(d)i=1[nd]f(i)\sum_{d=1}^{n}g(d)\sum_{i=1}^{\left [ \frac{n}{d} \right ] }f(i)

d=1ng(d)s([nd])\sum_{d=1}^{n}g(d)s(\left [ \frac{n}{d} \right ] )

然后有

g(1)s(n)=i=1ng(i)s([ni])i=2ng(i)s([ni])g(1)s(n)=\sum_{i=1}^{n}g(i)s(\left [ \frac{n}{i} \right ] )-\sum_{i=2}^{n}g(i)s(\left [ \frac{n}{i} \right ] )

g(1)s(n)=i=1n(fg)(i)i=2ng(i)s([ni])g(1)s(n)=\sum_{i=1}^{n}(f \ast g)(i)-\sum_{i=2}^{n}g(i)s(\left [ \frac{n}{i} \right ] )

选择合适的 gg,可以消掉 g(1)g(1) 并且方便地求出 i=1n(fg)(i)\sum_{i=1}^{n}(f \ast g)(i)i=2ng(i)\sum_{i=2}^{n}g(i) 通过前缀和可以求出,s([ni])s(\left [ \frac{n}{i} \right ] )可以通过数论分块+递归求出,总时间复杂度 O(n34)O(n^{\frac{3}{4}})

例如对于 f=μf=\mu 我们可以选取 g=Ig=Ifg=εf\ast g=\varepsilon

对于 f=φf=\varphi 我们可以选取 g=Ig=Ifg=idf \ast g =id

从而达到快速求解

最后更新于:2025-01-24 09:49:27

Caiwen
本文作者
一只蒟蒻,爱好编程和算法