寒假的时候雍老师就跟我们讲了,可惜当时是真的傻逼,雍老师讲的辣么详细都听不懂。。。考试全靠背公式,打暴力。这次才算是把寒假的坑填了大半,虽然我现在还是很菜。。。
线筛五连:
(1)线筛素数
(2)线筛欧拉函数
(3)线筛莫比乌斯函数
(4)线筛约数个数
(5)线筛约数和
对上述函数的定义与暴力求解(在上面的链接里均有提到)有一定了解,如果不甚了解,欢迎点击上面的链接,仍有不清楚的地方可自行百度。
对和号 ∑ ∑ (本质是枚举)有一定认识,熟悉表达式中的表述(如 gcd g c d ,下取整符号,整除符号)以及上述函数的基本性质(更深的内容会在本博客介绍并给出部分证明)。
怎么样,是不是门槛很低,接下来我们进入正题。
接下来的举例大多来自于博主做过的例题,可以到博主的博客首页查看
显然,当一个多项式中的所有项都与前面的一些和号的枚举值无关的话,我们就可以把这个多项式提前:
我们经常在更该枚举项后,交换这些枚举项的位置。
总的来说是一种更改求和的限制条件的方法,也是很多变形的本质。
在初始的式子里,枚举项经常有一些奇奇怪怪的限制,如下:
我们不妨直接枚举 d d ,把限制扔到后面去,去掉限制后,由技巧1, μ(d) μ ( d ) 也可以提到前面了:
但是限制貌似仍然没有消掉???我们仍可以再次更该枚举项,对于 d d ,我们不去枚举 i,j i , j ,因为后面的限制使 i,j i , j 必须为 d d 的倍数,所以我们不如直接枚举 d d 的倍数,便成功省去了最后的限制:
为什么上面的式子中 i,j i , j 的上限变小了?上面说到,我们直接枚举 d d 的倍数,反映到式子中就变成了枚举系数,即原来的 i i 变成了 i×d i × d , j j 变成了 j×d j × d 。最后由于和号已经没有限制了,我们便直接将其转化为多项式。
上面得到的式子是可以 O(n) O ( n ) 得到答案的,但是一般的莫比乌斯反演都有多组询问,每次都 O(n) O ( n ) 计算的话就只能乖乖 TLE T L E 。
观察上面的式子,发现对于一个 n n ,存在一段区间 [l,r] [ l , r ] 使得 ⌊nl⌋=⌊nr⌋=k ⌊ n l ⌋ = ⌊ n r ⌋ = k 且对于这个区间外的其它值 else e l s e ,均有 ⌊nelse⌋≠k ⌊ n e l s e ⌋ ≠ k 。
这样,对于上述的一个区间 [l,r] [ l , r ] , ∑ri=l⌊ni⌋ ∑ i = l r ⌊ n i ⌋ 是一个定值,应用到上面的式子中,就可以把 [1,n] [ 1 , n ] 划分成 n−−√ n 个区间快速求解。
先给个结论,当我们已知 l l 时,有 r=n⌊nl⌋ r = n ⌊ n l ⌋ ,证明如下:
设n=kl+x1=kr+x2且l,r<k 设 n = k l + x 1 = k r + x 2 且 l , r < k
先由定义算出 r r :
∴l=n−x1k,r=n−x2k ∴ l = n − x 1 k , r = n − x 2 k
∴r−l=x1−x2k ∴ r − l = x 1 − x 2 k
∴r=l+x1−x2k ∴ r = l + x 1 − x 2 k
∵x2<k,k|(x1−x2) ∵ x 2 < k , k | ( x 1 − x 2 )
∴x1−x2k=⌊x1k⌋ ∴ x 1 − x 2 k = ⌊ x 1 k ⌋
∴r=l+⌊x1k⌋ ∴ r = l + ⌊ x 1 k ⌋
再对等式右边进行变形:
∵⌊nl⌋=⌊nr⌋=k ∵ ⌊ n l ⌋ = ⌊ n r ⌋ = k
∴r=nk=l+⌊x1k⌋ ∴ r = n k = l + ⌊ x 1 k ⌋
综上: r=n⌊nl⌋ r = n ⌊ n l ⌋
证毕。
基本上是处理这种情况:
对于这种式子我们是不方便求解的,需要把判定条件改为 [gcd(i,j)=1] [ g c d ( i , j ) = 1 ] ,才能使用后面要讲的性质3进一步推导。那么,我们不如将 x x 当做“公因数”提出去:
其本质上也可以看做是一种更换枚举项的技巧,我们不去枚举 i,j i , j ,直接枚举 x x 的倍数,由于要求 gcd(i,j)=x g c d ( i , j ) = x ,直接枚举 x x 的倍数后就变成要求 gcd(i,j)=1 g c d ( i , j ) = 1 了。
同样的,我们观察操作2中讲到的变形:
也可以理解为提出了 d d ,式子变成:
由于 [1|gcd(i,j)] [ 1 | g c d ( i , j ) ] 相当于没有,所以就变成了上面讲到的样子。
但是,对于和号后不止一个判定条件,而是有其他式子时,提公因式时没有这么简单:
提公因式的本质为缩小枚举范围,在只有判定条件的时候,对于“计数”时没有影响的,但是在有了其他式子时,其他的式子在范围缩小后值也变小了,这样“求和”得到的结果就不对了,所以我们应该像普通提公因式的操作方式,给予”补偿”:
线性筛要求所筛函数为积性,即对于 gcd(x,y)=1 g c d ( x , y ) = 1 ,有:
在积性的前提下,我们通常按照套路对 f(x) f ( x ) 进行讨论:
1.当 x x 为素数时;
2.当 i mod p[j]=0 i m o d p [ j ] = 0 时;
3.当 i mod p[j]≠0 i m o d p [ j ] ≠ 0 时;
如果对上面表述的含义不清楚,可以参考上方的线筛五连。
以YY的GCD为例(以下内容直接摘自博主的题解):
设 f(T)=∑p|Tμ(Tp),T=i×p[j] f ( T ) = ∑ p | T μ ( T p ) , T = i × p [ j ] ,考虑线筛:
1.当 T T 本身为素数时,显然有 f(T)=μ(1)=1 f ( T ) = μ ( 1 ) = 1 ;
2.当 T T 拥有多个最小质因子(即 i mod p[j]=0 i m o d p [ j ] = 0 )时:
(1)当 i i 本身无多个相同质因子时,那么当且仅当我们枚举的素数等于 p[j] p [ j ] 时, μ(Tp) μ ( T p ) 的值不为 0 0 ,此时 p=p[j],T=i×p[j] p = p [ j ] , T = i × p [ j ] ,所以有 μ(Tp)=μ(i) μ ( T p ) = μ ( i ) ;
(2)当 i i 本身就是拥有多个因子的数时,无论我们怎么枚举, μ(Tp) μ ( T p ) 的值都为 0 0 ,此时,仍然有 μ(Tp)=μ(i) μ ( T p ) = μ ( i ) ;
3.当 T T 的最小质因子只有一个时:
此时, T T 就比 i i 多了一个质因数 p[j] p [ j ] ,因为有:
因为 i i 中没有质因数 p[j] p [ j ] ,所以有 μ(i×p[j]p)=−μ(ip) μ ( i × p [ j ] p ) = − μ ( i p ) ,在此基础上, T T 还多了一个 μ(i×p[j]p[j])=μ(i) μ ( i × p [ j ] p [ j ] ) = μ ( i ) 。可得, f(T)=−f(i)+μ(i) f ( T ) = − f ( i ) + μ ( i ) ;
综上,我们得到线筛方程:
只要对函数的讨论清晰,一般还是没什么问题。
有些时候会见到,这种形状:
又或者是:
注意到诸如 dp,dd′ d p , d d ′ 的形状看起来非常不爽,不如替换掉,以上面的第二个式子为例,设 T=dd′ T = d d ′ ,代入:
再枚举 T T :
利用下面讲到的结论4,即可化简为:
本质上,替换未知数也是为了方便更换枚举项。
如果说上面讲到的都是“普遍”形状,在求和算式中常常用到。
那么“特定”形状就是一些具有特别长相的式子,需要识别出来加以替换以进行下一步化简,下面介绍的性质和结论都是这样一类特殊的式子。
在上面线筛莫比乌斯函数的博客中提到了莫比乌斯函数的通俗定义:
(1)莫比乌斯函数 μ(n) μ ( n ) 的定义域是 N+ N +
(2) μ(1)=1 μ ( 1 ) = 1
(3)当n存在平方因子时, μ(n)=0 μ ( n ) = 0
(4)当n是素数或奇数个不同素数之积时, μ(n)=−1 μ ( n ) = − 1
(5)当n是偶数个不同素数之积时, μ(n)=1 μ ( n ) = 1
然而莫比乌斯函数的真正定义是这样的:
所以不如说上面的通俗定义才是莫比乌斯函数的性质,而莫比乌斯函数的真正定义是我们经常用到的一个性质。
对于函数 F(x),f(x) F ( x ) , f ( x ) ,如果有 F(x)=∑d|xf(d) F ( x ) = ∑ d | x f ( d ) ,那么就有:
证明如下:
直接将 F(x) F ( x ) 替换为 f(x) f ( x ) :
我们交换枚举顺序,先枚举 d′ d ′ :
由性质1,可得,当且仅当 xd′=1 x d ′ = 1 即 x=d′ x = d ′ 时 ∑d|xd′μ(d′) ∑ d | x d ′ μ ( d ′ ) 的值不为 0 0 ,因此:
证毕。
利用这个定理,可以设出具有上述关系的 F(x),f(x) F ( x ) , f ( x ) 进行各种骚操作,常见于各种神犇的博客。但是你在本蒟蒻的博客不会见到这种东西,博主不是很会,蒟蒻博主更习惯用更本质的莫比乌斯反演:性质3。
在反演时,博主经常使用这个结论:
证明非常简单,利用性质1,我们可以得到,当且仅当 gcd(i,j)=1 g c d ( i , j ) = 1 时, ∑d|gcd(i,j)μ(d) ∑ d | g c d ( i , j ) μ ( d ) 的值不为 0 0 。
欧拉函数与莫比乌斯函数有奇妙的关系:
我们考虑对欧拉函数的定义进行变形:
利用性质3:
我们直接枚举 d d :
考虑直接枚举 d d 的倍数,而不是去枚举 i i :
因为 μ(d) μ ( d ) 只与 d d 有关,可以提前:
对于我们枚举的 d|x d | x ,显然 xd x d 与 d d 是等价的,所以最后化简为:
证毕。
欧拉函数实际应用中出现频率不是很高,但在化简时若见到上述形状可以尝试进行替换。
神奇性质如下:
设 n=∏ki=1paii,m=∏ki=1pbii n = ∏ i = 1 k p i a i , m = ∏ i = 1 k p i b i
∴nm=∏ki=1pai+bii ∴ n m = ∏ i = 1 k p i a i + b i
∴σ0(nm)=∏ki=1(ai+bi+1) ∴ σ 0 ( n m ) = ∏ i = 1 k ( a i + b i + 1 )
对于 n,m n , m ,若前 i i 个质因子的贡献为 W W ,考虑第 i+1 i + 1 个质因子对答案的贡献:
选取 pi+1 p i + 1 的方案分别为:
1.由 x x 选取,那么可以选 1∼ai+1 1 ∼ a i + 1 个 pi+1 p i + 1 ,方案数为 ai+1 a i + 1 个;
2.由 y y 选取,那么可以选 1∼bi+1 1 ∼ b i + 1 个 pi+1 p i + 1 ,方案数为 bi+1 b i + 1 个;
3.都不选,方案数为 1 1 ;
所以选取 pi+1 p i + 1 的方案数总和为 ai+1+bi+1+1 a i + 1 + b i + 1 + 1 个。
故最后的方案数为:
证毕。
如果有更多的技巧与结论,博主会更新。