【学习小记】狄利克雷卷积+杜教筛

来源:互联网 发布:网络女主播闪现 编辑:程序博客网 时间:2024/06/07 05:16

Preface

这东西分明就是玄学暴力
用来求简单的数论函数的前缀和,像φ,μ这类的东西

当然,约数和,约数个数之类的也是可以的

Text

数论函数是指定义域是整数,陪域是复数的函数

Dirichlet 卷积

定义两个数论函数f,g
它们的狄利克雷卷积表示fg,设卷起来得到的新函数是h

h(i)=d|if(i)g(id)

明显h也是一个数论函数

显然它满足交换,结合律,甚至分配律

有常见的一些数论函数
1(i)=1n(i)=n(常函数)
e(1)=1,e(n)=0(n>1) (单位元)
id(i)=i
idk(i)=ik
μ(i)(莫比乌斯函数,不解释)
φ(i)(欧拉函数,不解释)
约数个数,设为d(i)=d|i1
约数和,设为σ(i)=d|id

显然有以下常见的卷积形式

任意函数卷积单位元仍为它本身

  • d=11

  • σ=id1

因为e(n)=d|nμ(d)
所以

  • e=1μ

因为φ(n)=d|nμ(d)nd
所以

  • φ=μid

因为n=d|nφ(d)
所以

  • id=φ1

杜教筛

考虑如何求μ的前缀和

比如说1010
线筛会T

S(n)=i=1nμ(i)
确定一个合适的数论函数g

i=1n(gμ)(i)=i=1nd|iμ(id)g(d)

交换主体
=d=1nd|iμ(id)g(d)

=d=1ng(d)i=1ndμ(i)

=d=1ng(d)S(nd)

那么g(1)S(n)=i=1n(gμ)(i)d=2ng(d)S(nd)

要使ggμ尽量容易求,可以想到g1函数是比较合适的,即g(i)=1

因为1μ=e
原式化为

S(n)=1d=2nS(nd)

可以用线筛预处理前(n)或者n23S,后面减的部分分块处理,递归下去,再哈希或者什么东西把算过的S记忆化一下

复杂度取决于预处理的多少

实验和理论都证明,预处理前n23个S,总复杂度最优,为O(n23)

据说证明要用积分?然而我并不会。。。

对于求欧拉函数的前缀和,方法也是一样的,g仍取1,只不过gφ=id
前面的1改成n(n+1)/2

原创粉丝点击