杜教筛入门

以下主要的话都用无序列表表示。

诶,是不是应该先讲背景

有什么好讲的?

问一个积性函数的前缀和,项数到1e10。

前置知识

线性筛积性函数

正文

钦定你已经可以再 O ( n ) O(\sqrt{n}) O(n )的复杂度内求出:

∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^n{\lfloor \frac{n}{i} \rfloor} i=1nin

∑ i = 1 n i ∗ ⌊ n i ⌋ \sum_{i=1}^n{i*\lfloor \frac{n}{i} \rfloor} i=1niin

对于第一个,先枚举小于 n \sqrt n n 的i,得出这段的值;又因为 i i i在一段区间内 ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor in都是 i 0 ≤ n i_0\leq \sqrt n i0n ,因此可以求前式和后式。

  • 形式化地讲,若 ∑ i = 1 n f ( i ) ∗ g ( ⌊ n i ⌋ ) \sum_{i=1}^n{f(i)*g(\lfloor \frac{n}{i} \rfloor)} i=1nf(i)g(in)中,若能方便的求得 f ( i ) f(i) f(i)的前缀和以及 g ( x ) g(x) g(x),就能方便的求得原式。

然后对于积性函数 f ( i ) f(i) f(i),我们想求 S n = ∑ i = 1 n f ( i ) S_n=\sum_{i=1}^n{f(i)} Sn=i=1nf(i)

那么,我们找一个积性函数 g g g,令 T n = ∑ d ∣ n g ( d ) ∗ f ( n d ) T_n=\sum_{d\mid n}g(d)*f(\frac{n}{d}) Tn=dng(d)f(dn)(就是狄利克雷卷积)。则有:
∑ i = 1 n T i = ∑ i = 1 n ∑ d ∣ i g ( d ) ∗ f ( i d ) = ∑ d = 1 n g ( d ) ∗ ∑ d ∣ i , i ≤ n f ( i d ) = ∑ d = 1 n g ( d ) ∗ S ⌊ n d ⌋ \begin{aligned} \sum_{i=1}^n{T_i} & =\sum_{i=1}^n \sum_{d\mid i}{g(d)*f(\frac{i}{d})} \\ & =\sum_{d=1}^n{g(d)*\sum_{d\mid i, i\leq n}{f(\frac{i}{d})}} \\ & =\sum_{d=1}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}} \end{aligned} i=1nTi=i=1ndig(d)f(di)=d=1ng(d)di,inf(di)=d=1ng(d)Sdn

然后,钦定 g ( 1 ) = 1 g(1)=1 g(1)=1,那么就有
S n = ∑ d = 1 n g ( d ) ∗ S ⌊ n d ⌋ − ∑ d = 2 n g ( d ) ∗ S ⌊ n d ⌋ = ∑ i = 1 n T i − ∑ d = 2 n g ( d ) ∗ S ⌊ n d ⌋ \begin{aligned} 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}} \\ & =\sum_{i=1}^n{T_i}-\sum_{d=2}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}} \end{aligned} Sn=d=1ng(d)Sdnd=2ng(d)Sdn=i=1nTid=2ng(d)Sdn

如果不管怎么求 S ⌊ n d ⌋ S_{\lfloor \frac{n}{d} \rfloor} Sdn的话,发现满足以下两个条件就可以求 S n S_n Sn了。

  • 可以求g的前缀和
  • 可以求T的前缀和

考虑怎么求上式后面的 S ⌊ n d ⌋ S_{\lfloor \frac{n}{d} \rfloor} Sdn,由于f是积性函数,必定可以用线性筛筛出前n项,于是可以用线性筛筛了f求出 S 1.. n S_{1..\sqrt n} S1..n ,至于大于 n \sqrt{n} n 的下标,可以记搜:因为 ⌊ ⌊ n d ⌋ e ⌋ = ⌊ n d ∗ e ⌋ \lfloor \frac{\lfloor \frac{n}{d} \rfloor}{e} \rfloor=\lfloor \frac{n}{d*e} \rfloor edn=den,于是可以记录n/d的d,当 d > n d>\sqrt{n} d>n 时直接返回结果就行。

  • 于是,求前缀和成功转化成用人类智慧求一个g。

模板题

对于 ϕ \phi ϕ,g为1(常值函数),T为i(自然数序列),用到的结论是 x = ∑ d ∣ x p h i d x=\sum_{d\mid x}{phi_d} x=dxphid

证明有这样几个方向:

  1. 证明 ∀ i ∣ n , 1 ≤ j &lt; i , ( i , j ) = 1 \forall i\mid n,1\leq j&lt;i,(i,j)=1 in,1j<i,(i,j)=1,都有 i 1 ∗ j 1 ≠ i 2 ∗ j 2 i_1*j_1\neq i_2*j_2 i1j1̸=i2j2。显然是要被叉翻的(其实是我在用3时不知道干嘛了)。
  2. 直接通过 ϕ \phi ϕ的计算公式和积性通过一波推理得到一些式子,化简得到n。(巨佬做法)
  3. 证明 ∀ i ∣ n , 1 ≤ j &lt; i , ( i , j ) = 1 \forall i\mid n,1\leq j&lt;i,(i,j)=1 in,1j<i,(i,j)=1,都有 n / i 1 ∗ j 1 ≠ n / i 2 ∗ j 2 n/i_1*j_1\neq n/i_2*j_2 n/i1j1̸=n/i2j2。显然,因为互质,所以两个都是最简分数,于是当i,j不同时,分数不可能相等,于是证明了任意一个 x ∈ [ 1 , n ] x\in [1,n] x[1,n]都只能由一个(i,j)对转移而来,即一一对应,证毕。

以上2的证明:
∑ d ∣ n ϕ ( d ) = ∑ ϕ ( ∏ i = 1 m p i j ) = ∑ ∏ i = 1 m ϕ ( p i j ) = ∏ i = 1 m ∑ j = 0 a i ϕ ( p i j ) = ∏ i = 1 m ( ∑ j = 1 a i ( p i j − p i j − 1 ) + 1 ) = ∏ i = 1 m p i a i = n \begin{aligned} \sum_{d\mid n}{\phi(d)} &amp; =\sum{\phi(\prod_{i=1}^m{p_i^j})} \\ &amp; =\sum{\prod_{i=1}^m{\phi(p_i^j)}} \\ &amp; =\prod_{i=1}^m{\sum_{j=0}^{a_i}{\phi(p_i^j)}} \\ &amp; =\prod_{i=1}^m{(\sum_{j=1}^{a_i}{(p_i^j-p_i^{j-1})}+1)} \\ &amp; =\prod_{i=1}^m{p_i^{a_i}}=n \end{aligned} dnϕ(d)=ϕ(i=1mpij)=i=1mϕ(pij)=i=1mj=0aiϕ(pij)=i=1m(j=1ai(pijpij1)+1)=i=1mpiai=n

然后写出来就可以了。

【代码代填坑】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值