积性函数前缀和——杜教筛

背景:

这课太无聊了,太吵学不进去,干脆写博客好了。

题目:

给定一个 n n n,求 ∑ i = 1 n μ ( i ) \sum_{i=1}^{n}\mu(i) i=1nμ(i) ∑ i = 1 n φ ( i ) \sum_{i=1}^{n}\varphi(i) i=1nφ(i)
( 1 ≤ n ≤ 1 0 10 ) (1\leq n\leq 10^{10}) (1n1010)
(某些积性函数前缀和)

引言:

如果不知道什么是积性函数出门左转隔壁教室

我们知道, μ \mu μ函数和 φ \varphi φ可以 o ( n ) o(\sqrt{n}) o(n )求单点的值。
也可以用线性筛 o ( n ) o(n) o(n)预处理出多点的值。
但是显然都不够用来做这个题。

那么神奇的地方来了,这些积性函数竟然有亚线性算法求出前缀和,可能这就是数学的魅力吧。
这里我们介绍其中一个方法,杜教筛,它可以在 o ( n 3 4 ) o(n^{\frac{3}{4}}) o(n43)的复杂度内求出积性函数的前缀和。并且我们可以预处理出前 1 0 6 10^6 106个前缀和,将它的复杂度优化到 o ( n 2 3 ) o(n^{\frac{2}{3}}) o(n32)

正文:杜教筛

假定我们要求前缀和的函数是 f f f,并令它的前缀和 S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^{n}f(i) S(n)=i=1nf(i)
我们找另一个函数 g g g跟它卷积求前缀和。
∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) \sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)f(\frac{i}{d}) i=1n(fg)(i)=i=1ndig(d)f(di)

                              = ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) =\sum_{d=1}^{n}g(d)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}f(i) =d=1ng(d)i=1dnf(i)

                              = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) =\sum_{d=1}^{n}g(d)S(\lfloor \frac{n}{d} \rfloor) =d=1ng(d)S(dn)

推到这里,我们发现后面这是一个明显的数论分块式子。
但是这个式子里没有 S ( n ) S(n) S(n)呀,没 S ( n ) S(n) S(n)我们求啥。
所以现在我们要把 S ( n ) S(n) S(n)弄出来。
我们发现当 d = 1 d=1 d=1时,后面这个东西 g ( 1 ) S ( ⌊ n 1 ⌋ ) = S ( n ) g(1)S(\lfloor \frac{n}{1} \rfloor)=S(n) g(1)S(1n)=S(n)
然后 S ( n ) S(n) S(n)就来了。
S ( n ) = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) − ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) S(n)=\sum_{d=1}^{n}g(d)S(\lfloor \frac{n}{d} \rfloor)-\sum_{d=2}^{n}g(d)S(\lfloor \frac{n}{d} \rfloor) S(n)=d=1ng(d)S(dn)d=2ng(d)S(dn)

           = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) =\sum_{i=1}^{n}(f*g)(i)-\sum_{d=2}^{n}g(d)S(\lfloor \frac{n}{d} \rfloor) =i=1n(fg)(i)d=2ng(d)S(dn)

那么后面这个式子还是一个数论分块的式子,只要我们可以快速求出 g g g的前缀和,就可以快速地求出来。

所以我们需要找到一个 g g g,使得 g g g f ∗ g f*g fg的前缀和都好求。

我们现在算一下复杂度,假设 g g g f ∗ g f*g fg的前缀和都可以 o ( 1 ) o(1) o(1)求出。
那么有.
打扰了 ,反正复杂度是 o ( n 3 4 ) o(n^{\frac{3}{4}}) o(n43),如果我们预处理出前 1 0 6 10^6 106项,然后再加个记忆化,复杂度就变成 o ( n 2 3 ) o(n^{\frac{2}{3}}) o(n32)了。

代码略了,请读者自行编写过题。

例题1:求 ∑ i = 1 n μ ( i ) \sum_{i=1}^{n}\mu(i) i=1nμ(i)

当我们考虑用杜教筛求解积性函数前缀和时,主要就是找一个 g g g使得 g g g f ∗ g f*g fg的前缀和好求。
那么对于莫比乌斯函数 μ \mu μ,我们毫无疑问是选择用 1 1 1函数。
μ ∗ 1 = e \mu *1=e μ1=e
那么 1 1 1函数和 e e e函数的前缀和就不用多说什么了。
理A。

例题2:求 ∑ i = 1 n φ ( i ) \sum_{i=1}^{n}\varphi(i) i=1nφ(i)

g g g仍选择用 1 1 1函数,有 φ ∗ 1 = i d \varphi *1=id φ1=id
那么 1 1 1函数和 i d id id函数的前缀和也很好求。

例题3:求 ∑ i = 1 n i φ ( i ) \sum_{i=1}^{n}i\varphi(i) i=1niφ(i)

我们选用 i d id id作为 g g g函数,首先 i d id id函数的前缀和可以求。
∑ i = 1 n ( f ∗ i d ) ( i ) = ∑ i = 1 n ∑ d ∣ i d φ ( d ) ∗ i d = ∑ i = 1 n i ∑ d ∣ i φ ( d ) = ∑ i = 1 n i 2 \sum_{i=1}^{n}(f*id)(i)=\sum_{i=1}^{n}\sum_{d|i}d\varphi(d)*\frac{i}{d}=\sum_{i=1}^{n}i\sum_{d|i}\varphi(d)=\sum_{i=1}^{n}i^{2} i=1n(fid)(i)=i=1ndidφ(d)di=i=1nidiφ(d)=i=1ni2
其中,因为 1 ∗ φ = i d 1*\varphi =id 1φ=id,所以 ∑ d ∣ i φ ( d ) = i \sum_{d|i}\varphi(d)=i diφ(d)=i

例题n+2:求 ∑ i = 1 n i n φ ( i ) \sum_{i=1}^{n}i^{n}\varphi(i) i=1ninφ(i)

我们选用 i d n id^{n} idn作为 g g g函数,那么 i d n id^{n} idn的前缀和可以求。(拉格朗日插值?)
∑ i = 1 n ( f ∗ i d ) ( i ) = ∑ i = 1 n ∑ d ∣ i d n φ ( d ) ∗ ( i d ) n = ∑ i = 1 n i n ∑ d ∣ i φ ( d ) = ∑ i = 1 n i n + 1 \sum_{i=1}^{n}(f*id)(i)=\sum_{i=1}^{n}\sum_{d|i}d^{n}\varphi(d)*(\frac{i}{d})^{n}=\sum_{i=1}^{n}i^{n}\sum_{d|i}\varphi(d)=\sum_{i=1}^{n}i^{n+1} i=1n(fid)(i)=i=1ndidnφ(d)(di)n=i=1nindiφ(d)=i=1nin+1

暂时我知道就上面这些吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值