数论变换入门 莫比乌斯反演 杜教筛

也许你已经学习了莫比乌斯反演,但看到式子还是不会化对不对。
但是你不用管它,就当你没学过,先记住两个式子:
等式一 [ n = 1 ] = ∑ d ∣ n μ d [n=1]=\sum_{d|n}\mu_d [n=1]=dnμd
等式二 n = ∑ d ∣ n φ d n=\sum_{d|n}\varphi_d n=dnφd
那么容易发现这两个等式的意义,等式一可以把一个“判一”的式子化成可以计算的函数,等式二把一个数化到枚举范围里面去。
这么说不是很清楚,但一般来说我们都用以下的形式:
等式一变式 [ gcd ⁡ ( a , b ) = 1 ] = ∑ d ∣ gcd ⁡ ( a , b ) μ d [\gcd(a,b)=1]=\sum_{d|\gcd(a,b)}\mu_d [gcd(a,b)=1]=dgcd(a,b)μd
等式二变式 gcd ⁡ ( a , b ) = ∑ d ∣ gcd ⁡ ( a , b ) φ d \gcd(a,b)=\sum_{d|\gcd(a,b)}\varphi_d gcd(a,b)=dgcd(a,b)φd

这两个式子是你首先要记住的。我们来看一道例题,这之后你可以学会DDZ重排,之后更多的内容就易如反掌了。以下的新内容都是DDZ重排。
【例题】求 ∑ i = 1 n gcd ⁡ ( i , n ) \sum_{i=1}^n\gcd(i,n) i=1ngcd(i,n)
根据等式二变形,原式 = ∑ i = 1 n ∑ d ∣ gcd ⁡ ( i , n ) φ d =\sum_{i=1}^n\sum_{d|\gcd(i,n)}\varphi_d =i=1ndgcd(i,n)φd
我们知道,一个数是 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)的因数,意味着它既整除 a a a又整除 b b b
那么,如果枚举 d d d取遍 1 1 1 n n n的所有值( n n n d d d的最大可能值),然后在 φ d \varphi_d φd前面乘上满足的条件,也就是 [ d ∣ i ] [ d ∣ j ] [d|i][d|j] [di][dj],不就一样了吗?
= ∑ i = 1 n ∑ d = 1 n [ d ∣ i ] [ d ∣ n ] φ d =\sum_{i=1}^n\sum_{d=1}^n[d|i][d|n]\varphi_d =i=1nd=1n[di][dn]φd
显然,满足 [ d ∣ n ] = 1 [d|n]=1 [dn]=1的时候, d d d n n n的因数。因此我们先把它放到条件里面去。条件中两个都是常数,可以放到条件里。
= ∑ i = 1 n ∑ d ∣ n [ d ∣ i ] φ d =\sum_{i=1}^n\sum_{d|n}[d|i]\varphi_d =i=1ndn[di]φd
我们发现 d d d的枚举与 i i i毫无关系,于是可以任意调换和号的位置。
= ∑ d ∣ n ∑ i = 1 n [ d ∣ i ] φ d =\sum_{d|n}\sum_{i=1}^n[d|i]\varphi_d =dni=1n[di]φd
因为是先枚举的 d d d,因此在枚举 i i i的时候, d d d相当于已经成为常数了。因此 φ d \varphi_d φd也是常数,我们可以把它提到外面去(乘法分配律)。
= ∑ d ∣ n φ d ∑ i = 1 n [ d ∣ i ] =\sum_{d|n}\varphi_d\sum_{i=1}^n[d|i] =dnφdi=1n[di]
现在我们考察最后一个条件, d d d是确定的,要使 i i i d d d的倍数, ∑ i = 1 n [ d ∣ i ] \sum_{i=1}^n[d|i] i=1n[di]事实上就是求小于等于 n n n的范围内 d d d的倍数的个数。那不就直接除一下就是答案吗。
= ∑ d ∣ n φ d ⌊ n d ⌋ =\sum_{d|n}\varphi_d\lfloor\frac{n}{d}\rfloor =dnφddn

学了DDZ重排,我们再来看由它得到的显然的几个结论。
重排变换 ∑ i = 1 n ∑ d ∣ gcd ⁡ ( i , n ) f d = ∑ d ∣ n f d ⌊ n d ⌋ \sum_{i=1}^n\sum_{d|\gcd(i,n)}f_d=\sum_{d|n}f_d\lfloor\frac{n}{d}\rfloor i=1ndgcd(i,n)fd=dnfddn
混合重排变换 ∑ i = 1 n ∑ d ∣ gcd ⁡ ( i , m ) f d = ∑ d ∣ m f d ⌊ n d ⌋ \sum_{i=1}^n\sum_{d|\gcd(i,m)}f_d=\sum_{d|m}f_d\lfloor\frac{n}{d}\rfloor i=1ndgcd(i,m)fd=dmfddn
扩展混合重排变换 ∑ i = 1 n ∑ d ∣ gcd ⁡ ( i , m ) f d g i = ∑ d ∣ m f d ∑ i = 1 ⌊ n d ⌋ g i d \sum_{i=1}^n\sum_{d|\gcd(i,m)}f_dg_i=\sum_{d|m}f_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}g_{id} i=1ndgcd(i,m)fdgi=dmfdi=1dngid
其中第三个用到了扩展变换,如下
扩展变换 ∑ i = 1 n [ d ∣ i ] f i = ∑ i = 1 ⌊ n d ⌋ f i d \sum_{i=1}^n[d|i]f_i=\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f_{id} i=1n[di]fi=i=1dnfid

除此之外,还有一个新等式和两个重要的新变换
等式三 ∑ d ∣ n μ d d = φ n n \sum_{d|n}\frac{\mu_d}{d}=\frac{\varphi_n}{n} dndμd=nφn
收缩变换 ∑ i = 1 n ∑ d ∣ i f d = ∑ i = 1 n ∑ d = 1 ⌊ n i ⌋ f d \sum_{i=1}^n\sum_{d|i}f_d=\sum_{i=1}^n\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d i=1ndifd=i=1nd=1infd
扩展变换和收缩变换都可以把枚举因数变成枚举前缀。注意扩展变换中变量是 i i i,而收缩变换中变量是 d d d
杜教筛变换 ∑ i = 1 n ∑ d ∣ i f d g i d = ∑ i = 1 n g i ∑ d = 1 ⌊ n i ⌋ f d \sum_{i=1}^n\sum_{d|i}f_dg_{\frac{i}{d}}=\sum_{i=1}^ng_i\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d i=1ndifdgdi=i=1ngid=1infd
12.24写为 [ 1 , n ] [ i ] f ∗ g = [ 1 , n ] g ( i ) f ( [ 1 , ⌊ n i ⌋ ] ) [1,n][i]f*g=[1,n]g(i)f([1,\lfloor\frac{n}{i}\rfloor]) [1,n][i]fg=[1,n]g(i)f([1,in])
不能构造收缩变换的时候,可以构造一个 g x g_x gx,然后构造杜教筛变换。
若前缀和可以线性预处理则复杂度为 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32),否则复杂度为 O ( n 3 4 ) O(n^{\frac{3}{4}}) O(n43)
上一篇博客讲了构造收缩变换,这里讲一道杜教筛变换。
【例题】求 ∑ i = 1 n φ i i \sum_{i=1}^n\varphi_ii i=1nφii
我们要找一个与 φ i i \varphi_ii φii有关的式子。
如果只有 φ i \varphi_i φi的话,我们有 ∑ d ∣ n φ d = n \sum_{d|n}\varphi_d=n dnφd=n,然后套个前缀就可以收缩变换了。
构造杜教筛变换的要点是找到一个函数 g n d g_\frac{n}{d} gdn,使与原来的 f d f_d fd乘起来可以套用公式。
这个 i i i很烦,考虑把它吃掉。
于是构造式子 ∑ d ∣ n φ d d n d = n 2 \sum_{d|n}\varphi_dd\frac{n}{d}=n^2 dnφdddn=n2
为什么右边是 n 2 n^2 n2应该比较显然吧。这里我们把 n d \frac{n}{d} dn当做 g d g_d gd,套一个前缀:
∑ i = 1 n ∑ d ∣ i φ d d i d = ∑ i = 1 n i 2 \sum_{i=1}^n\sum_{d|i}\varphi_dd\frac{i}{d}=\sum_{i=1}^ni^2 i=1ndiφdddi=i=1ni2
直接套杜教筛变换。(对照上面的式子看一下)
∑ i = 1 n i ∑ d = 1 ⌊ n i ⌋ φ d d = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^ni\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}\varphi_dd=\frac{n(n+1)(2n+1)}{6} i=1nid=1inφdd=6n(n+1)(2n+1)
∑ i = 1 n i S ⌊ n i ⌋ = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6} i=1niSin=6n(n+1)(2n+1)
S n + ∑ i = 2 n i S ⌊ n i ⌋ = n ( n + 1 ) ( 2 n + 1 ) 6 S_n+\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6} Sn+i=2niSin=6n(n+1)(2n+1)
S n = n ( n + 1 ) ( 2 n + 1 ) 6 − ∑ i = 2 n i S ⌊ n i ⌋ S_n=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor} Sn=6n(n+1)(2n+1)i=2niSin
然后就杜教筛 O ( n 2 3 ) O(n^\frac{2}{3}) O(n32)求。


补充:约数个数变换: d n m = ∑ i ∣ n ∑ j ∣ m [ gcd ⁡ ( i , j ) = 1 ] d_{nm}=\sum_{i|n}\sum_{j|m}[\gcd(i,j)=1] dnm=injm[gcd(i,j)=1] (SDOI2015)
20180927补充: ∑ i ∣ n μ ( i ) = 0 ( n > 1 ) \sum_{i|n}\mu(i)=0(n>1) inμ(i)=0(n>1)

2018.12.16 可能有用这个等式: μ ( a b ) = [ gcd ⁡ ( a , b ) = 1 ] μ ( a ) μ ( b ) \mu(ab)=[\gcd(a,b)=1]\mu(a)\mu(b) μ(ab)=[gcd(a,b)=1]μ(a)μ(b)。即考虑 μ \mu μ在什么时候为 0 0 0

你可能感兴趣的:(数论)