我是靠谱客的博主 爱笑香水,最近开发中收集的这篇文章主要介绍反演&&杜教筛,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

大力鸣谢曲神的blog

反演

曾经naive的博主写的反演讲解
反演中常见公式


杜教筛

从未见过如此厚颜无耻之博主,说好了要讲反演nei,为什么只给两个链接???
好吧,我承认这篇文主要是想说说自己对杜教筛的崭新认识,所以下面才是正文。。。

学杜教筛之前,一定要做一件事:%糖教

简介

杜教筛是干什么的内?求解积性函数前缀和的有力工具
划重点:积性函数,前缀和

积性函数

  • 常见积性函数

    • 除数函数 σk(n)=d|ndk σ k ( n ) = ∑ d | n d k ,表示 n n 的约数的k次幂和,注意 σk(n) σ k ( n ) σk(n) σ k ( n ) 是不同的

    • 约数个数函数 τ(n)=σ0(n)=d|n1 τ ( n ) = σ 0 ( n ) = ∑ d | n 1 ,表示 n n 的约数个数,一般也写为d(n)

    • 约数和函数 σ(n)=σ1(n)=d|nd σ ( n ) = σ 1 ( n ) = ∑ d | n d ,表示 n n 的约数之和

    • 欧拉函数φ(n)=i=1n[(n,i)=1],表示不大于 n n 且与n互质的正整数个数
      另外 ni=1[(n,i)=1]i=nφ(n)+[n=1]2 ∑ i = 1 n [ ( n , i ) = 1 ] ⋅ i = n ⋅ φ ( n ) + [ n = 1 ] 2 (互质数之和)

    • 莫比乌斯函数 μ(n) μ ( n ) ,在狄利克雷卷积的乘法中与恒等函数互为逆元, μ(1)=1 μ ( 1 ) = 1 ,对于无平方因子数 n=ti=1pi n = ∏ i = 1 t p i μ(n)=(1)t μ ( n ) = ( − 1 ) t ,对于有平方因子数 n n μ(n)=0

    • 元函数 e(n)=[n=1] e ( n ) = [ n = 1 ] ,狄利克雷卷积的乘法单位元,完全积性

    • 恒等函数 I(n)=1 I ( n ) = 1 ,完全积性

    • 单位函数 id(n)=n i d ( n ) = n ,完全积性

    • 幂函数 idk(n)=nk i d k ( n ) = n k ,完全积性

  • 关于莫比乌斯函数和欧拉函数的经典公式

    • [n=1]=d|nμ(d) [ n = 1 ] = ∑ d | n μ ( d ) ,将 μ(d) μ ( d ) 看作是容斥的系数即可证明

    • n=d|nφ(d) n = ∑ d | n φ ( d ) ,将 in(1in) i n ( 1 ≤ i ≤ n ) 化为最简分数统计个数即可证明

    • μI=e μ ∗ I = e

    • ϕI=id(n) ϕ ∗ I = i d ( n )

  • f(n) f ( n ) 为积性函数,则对于正整数 n=ti=1pkii n = ∏ i = 1 t p i k i f(n)=ti=1f(pkii) f ( n ) = ∏ i = 1 t f ( p i k i )
    f(n) f ( n ) 为完全积性函数,则对于正整数 n=ti=1pkii n = ∏ i = 1 t p i k i f(n)=ti=1f(pi)ki f ( n ) = ∏ i = 1 t f ( p i ) k i

综述

有数论函数 f(n) f ( n ) ,求 S(n)=ni=1f(i) S ( n ) = ∑ i = 1 n f ( i )
那么对于任意数论函数 g(n) g ( n ) ,满足 ni=1(fg)(i)=ni=1g(i)S(ni) ∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n g ( i ) S ( n i )

证明

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

考虑枚举 j=id j = i d ,那么就是

j=1ng(j)pf(p) ∑ j = 1 n g ( j ) ∑ p f ( p )

考虑如何枚举 p p
也就是我们固定了id,再考虑所有对ta造成贡献的 d d
这样我们就可以考虑枚举一层d(换成 p p ),得到i=pj
我们可以想到,只要这里的 i<=n i <= n ,这个 p p 就是合法的
这样就限制了p枚举的上界: nj n j ,则有:

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

=j=1ng(j)p=1njf(p) = ∑ j = 1 n g ( j ) ∑ p = 1 n j f ( p )

=i=1ng(i)d=1nif(d) = ∑ i = 1 n g ( i ) ∑ d = 1 n i f ( d )

=i=1ng(i)S(ni) = ∑ i = 1 n g ( i ) S ( n i )

这样得到:

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

一般的,我们找的 g(n) g ( n ) 是个积性函数或者常函数, g(1) g ( 1 ) 一般为1,而且意味着 fg f ∗ g g g 是很好求和的函数

这样我们只需要对i=2ng(i)S(ni)分块即可

总的来说:

如果能通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程

这样我们在遇到积性函数的前缀和的时候,直接套上式子即可(即使忘记了我们还是可以重新通过证明倒出来)

经典例题

1. 杜教筛 ϕ ϕ 之和

计算 ni=1ϕ(i) ∑ i = 1 n ϕ ( i )
ϕI=id ϕ ∗ I = i d ,简单的,我们卷上一个 I I (常函数)

S(n)=i=1n(ϕI)(i)i=2nS(ni)

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

2. 杜教筛 μ μ 之和

计算 ni=1μ(i) ∑ i = 1 n μ ( i )
μI=e μ ∗ I = e ,我们还是卷上一个 I I

S(n)=i=1n(μI)(i)i=2nS(ni)=1i=2nS(ni)

3 . 杜教筛 d d 之和

i=1nd(i)
dμ=1 d ∗ μ = 1 ,我们卷上 μ μ

S(n)=i=1n(dμ)(i)i=2nμ(i)S(ni)=ni=2nμ(i)S(ni) S ( n ) = ∑ i = 1 n ( d ∗ μ ) ( i ) − ∑ i = 2 n μ ( i ) S ( n i ) = n − ∑ i = 2 n μ ( i ) S ( n i )

4 . 杜教筛 lcm l c m 之和

ni=1mj=1lcm(i,j) ∑ i = 1 n ∑ j = 1 m l c m ( i , j )

i=1nj=1mlcm(i,j) ∑ i = 1 n ∑ j = 1 m l c m ( i , j )

=i=1nj=1mijgcd(i,j) = ∑ i = 1 n ∑ j = 1 m i j g c d ( i , j )

=d=1min(n,m)dk=1min(n/d,m/d)μ(k)k2sum(nkd)sum(mkd)    sum(n)=n(n+1)2 = ∑ d = 1 m i n ( n , m ) d ∑ k = 1 m i n ( n / d , m / d ) μ ( k ) k 2 s u m ( n k d ) s u m ( m k d )         s u m ( n ) = n ( n + 1 ) 2

=T=1nnTmTd|Tdμ(Td)(Td)2 = ∑ T = 1 n n T m T ∑ d | T d · μ ( T d ) ( T d ) 2

显然预处理线筛一下 d|Tdμ(Td)(Td)2 ∑ d | T d · μ ( T d ) ( T d ) 2 即可

5. 杜教筛 gcd g c d 之和

ni=1mj=1gcd(i,j) ∑ i = 1 n ∑ j = 1 m g c d ( i , j )

i=1nj=1md|gcd(i,j)ϕ(d) ∑ i = 1 n ∑ j = 1 m ∑ d | g c d ( i , j ) ϕ ( d )

=i=1nj=1md=1min(n,m)d|id|jϕ(d) = ∑ i = 1 n ∑ j = 1 m ∑ d = 1 m i n ( n , m ) ∑ d | i ∑ d | j ϕ ( d )

=d=1min(n,m)ϕ(d)i=1nj=1md|id|j1 = ∑ d = 1 m i n ( n , m ) ϕ ( d ) ∑ i = 1 n ∑ j = 1 m ∑ d | i ∑ d | j 1

=d=1min(n,m)ϕ(d)ndmd = ∑ d = 1 m i n ( n , m ) ϕ ( d ) n d m d

杜教筛 ϕ(i) ϕ ( i ) 的前缀和即可

6 . 约数个数和
ni=1mj=1d(i,j) ∑ i = 1 n ∑ j = 1 m d ( i , j )
d(i,j)=i|nj|m[gcd(i,j)=1] d ( i , j ) = ∑ i | n ∑ j | m [ g c d ( i , j ) = 1 ]

i=1nj=1mnimj[gcd(i,j)=1] ∑ i = 1 n ∑ j = 1 m n i m j [ g c d ( i , j ) = 1 ]

=i=1nnij=1mmjd=1d|id|jμ(d) = ∑ i = 1 n n i ∑ j = 1 m m j ∑ d = 1 ∑ d | i ∑ d | j μ ( d )

=d=1μ(d)i=1nnij=1mmjd|id|j1 = ∑ d = 1 μ ( d ) ∑ i = 1 n n i ∑ j = 1 m m j ∑ d | i ∑ d | j 1

=d=1μ(d)p=1n/dnpdq=1m/dmqd   (i=pd,j=qd) = ∑ d = 1 μ ( d ) ∑ p = 1 n / d n p d ∑ q = 1 m / d m q d       ( i = p d , j = q d )

预处理 n/dp=1npd ∑ p = 1 n / d n p d

7 . 求 i=1μ(i)i2 ∑ i = 1 μ ( i ) i 2

[i=1nμ(i)i2]i=1i2 [ ∑ i = 1 n μ ( i ) i 2 ] ∗ ∑ i = 1 i 2

=i=1nd|iμ(d)d2(id)2 = ∑ i = 1 n ∑ d | i μ ( d ) d 2 ( i d ) 2

=i=1ni2d|iμ(d) = ∑ i = 1 n i 2 ∑ d | i μ ( d )

因为 d|nμ(d)=[n=1] ∑ d | n μ ( d ) = [ n = 1 ]
所以上式

[i=1nμ(i)i2]i=1i2=1 [ ∑ i = 1 n μ ( i ) i 2 ] ∗ ∑ i = 1 i 2 = 1

S(n)=ni=1μ(i)i2 S ( n ) = ∑ i = 1 n μ ( i ) i 2

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

其中 ni=1i2=n(n+1)(2n+1)6 ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6

最后

以上就是爱笑香水为你收集整理的反演&&杜教筛的全部内容,希望文章能够帮你解决反演&&杜教筛所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部