杜教筛

本文详细介绍了杜教筛算法的基本原理及其应用实例。通过解析狄利克雷卷积和数论性质,展示了如何高效地计算特定函数的前缀和。特别针对积性函数的求和问题,给出了具体的算法步骤,并通过实例说明了算法的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

杜教筛

求积性函数f(x)f(x)的前缀和S(n)=ni=1f(i)S(n)=∑i=1nf(i)

狄利克雷卷积:

(gf)(x)=d|xg(d)f(xd)(g∗f)(x)=∑d|xg(d)f(xd)

x=1n(gf)(x)=x=1nd|xg(d)f(xd)∑x=1n(g∗f)(x)=∑x=1n∑d|xg(d)f(xd)

=d=1nd|xng(d)f(xd)=∑d=1n∑d|xng(d)f(xd)

=d=1ng(d)x=1n/df(x)=∑d=1ng(d)∑x=1n/df(x)

=d=1ng(d)S(nd)=∑d=1ng(d)S(⌊nd⌋)


x=1n(gf)(x)=d=1ng(d)S(nd)∑x=1n(g∗f)(x)=∑d=1ng(d)S(⌊nd⌋)

我们有

g(1)S(n)=i=1ng(i)S(ni)i=2ng(i)S(ni)g(1)S(n)=∑i=1ng(i)S(⌊ni⌋)−∑i=2ng(i)S(⌊ni⌋)

g(1)S(n)=i=1n(gf)(i)i=2ng(i)S(ni)g(1)S(n)=∑i=1n(g∗f)(i)−∑i=2ng(i)S(⌊ni⌋)

假设我们要求S(n)=ni=1μ(i)S(n)=∑i=1nμ(i)

我们只需要找出g(x)g(x)使得(gf)(x)(g∗f)(x)的前缀和好算就可以了
我们知道

d|nμ(d)=[n=1]∑d|nμ(d)=[n=1]

那么我们可以设g(x)=1g(x)=1
这样的话

(gf)(x)=d|xf(d)g(dx)=[x=1](g∗f)(x)=∑d|xf(d)g(dx)=[x=1]

i=1x(gf)(x)=1∑i=1x(g∗f)(x)=1

g(1)S(n)=1i=2nS(ni)g(1)S(n)=1−∑i=2nS(⌊ni⌋)

后面的部分可以数论分块
首先先线性筛出前面一部分(10000001000000μ(x)μ(x)的前缀和,后面记忆化搜索即可


再假设我们要求S(n)=ni=1ϕ(i)S(n)=∑i=1nϕ(i)

我们知道

d|nϕ(d)=n∑d|nϕ(d)=n

(gf)(x)=d|xf(d)g(xd)(g∗f)(x)=∑d|xf(d)g(xd)

我们发现如果令g(x)=1g(x)=1

(gf)(x)=d|xf(d)=x(g∗f)(x)=∑d|xf(d)=x

g(1)S(n)=i=1nii=2ng(i)S(ni)g(1)S(n)=∑i=1ni−∑i=2ng(i)S(⌊ni⌋)

S(n)=x(x+1)2i=2nS(ni)S(n)=x(x+1)2−∑i=2nS(⌊ni⌋)

51nod1238 最小公倍数之和V3


i=1nj=1nlcm(i,j)∑i=1n∑j=1nlcm(i,j)

ans=i=1nj=1nijgcd(i,j)ans=∑i=1n∑j=1nijgcd(i,j)

=d=1n1di=1nj=1nij [gcd(i,j)=d]=∑d=1n1d∑i=1n∑j=1nij [gcd(i,j)=d]

=d=1n1di=1n/dj=1n/did jd [gcd(i,j)=1]=∑d=1n1d∑i=1n/d∑j=1n/did jd [gcd(i,j)=1]

=d=1ndi=1n/dj=1n/dij [gcd(i,j)=1]=∑d=1nd∑i=1n/d∑j=1n/dij [gcd(i,j)=1]

f(x)=i=1xj=1xij[gcd(i,j)=1]f(x)=∑i=1x∑j=1xij[gcd(i,j)=1]

=2(i=1xij=1ij[gcd(i,j)=1])1=2(∑i=1xi∑j=1ij[gcd(i,j)=1])−1

=2(i=1xi iϕ(i)+[i=1]2)1=2(∑i=1xi iϕ(i)+[i=1]2)−1

=(i=1xi2 ϕ(i)+[i=1])1=(∑i=1xi2 ϕ(i)+[i=1])−1

=i=1xi2 ϕ(i)=∑i=1xi2 ϕ(i)

代回原式子

ans=d=1ndi=1n/di2 ϕ(i)ans=∑d=1nd∑i=1n/di2 ϕ(i)

S(n)=i=1ni2 ϕ(i)S(n)=∑i=1ni2 ϕ(i)

S(n)=i=1n(gf)(i)i=2ng(i)S(ni)S(n)=∑i=1n(g∗f)(i)−∑i=2ng(i)S(ni)

推一下卷积

i=1n(gf)(x)=i=1nd|if(d)g(id)∑i=1n(g∗f)(x)=∑i=1n∑d|if(d)g(id)

=i=1nd|id2ϕ(d)g(id)=∑i=1n∑d|id2ϕ(d)g(id)

我们发现设g(x)=x2g(x)=x2就可以把d2d2约掉

=i=1nd|id2ϕ(d)i2d2=∑i=1n∑d|id2ϕ(d)i2d2

=i=1ni2d|iϕ(d)=∑i=1ni2∑d|iϕ(d)

=i=1ni3=∑i=1ni3

=(n(n+1)2)2=(n(n+1)2)2

g(1)S(n)=i=1n(gf)(x)i=2ng(i)S(ni)g(1)S(n)=∑i=1n(g∗f)(x)−∑i=2ng(i)S(ni)

S(n)=(n(n+1)2)2i=2ni2S(ni)S(n)=(n(n+1)2)2−∑i=2ni2S(ni)

我们知道

i=1ni2=n(n+1)(2n+1)6∑i=1ni2=n(n+1)(2n+1)6

我们可以杜教筛S(n)S(n)

ans=d=1nd S(nd)ans=∑d=1nd S(nd)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值