Preface
这东西分明就是玄学暴力
用来求简单的数论函数的前缀和,像φ,μ这类的东西
当然,约数和,约数个数之类的也是可以的
Text
数论函数是指定义域是整数,陪域是复数的函数
Dirichlet 卷积
定义两个数论函数f,g
它们的狄利克雷卷积表示f∗g,设卷起来得到的新函数是h
明显h也是一个数论函数
显然它满足交换,结合律,对加法满足分配律
有常见的一些数论函数
e(1)=1,e(n)=0(n>1)(单位元)
id(i)=i
idk(i)=ik
μ(i)(莫比乌斯函数,不解释)
φ(i)(欧拉函数,不解释)
约数个数,设为d(i)=∑d|i1
约数和,设为σ(i)=∑d|id
显然有以下常见的卷积形式
任意函数卷积单位元仍为它本身
d=1∗1
σ=id∗1
因为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
交换主体
=∑d=1n∑d|iμ(id)g(d)
=∑d=1ng(d)∑i=1⌊nd⌋μ(i)
=∑d=1ng(d)S(⌊nd⌋)
那么g(1)S(n)=∑i=1n(g∗μ)(i)−∑d=2ng(d)S(⌊nd⌋)
要使g和
因为1∗μ=e
原式化为
S(n)=1−∑d=2nS(⌊nd⌋)
可以用线筛预处理前(√n)或者n23的S,后面减的部分分块处理,递归下去,再哈希或者什么东西把算过的S记忆化一下
复杂度取决于预处理的多少
实验和理论都证明,预处理前
据说证明要用积分?然而我并不会。。。
对于求欧拉函数的前缀和,方法也是一样的,g仍取
前面的1改成n(n+1)/2
版权声明:本文为hzj1054689699原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。