莫名其妙地写完了杜教筛的几道题?
然而理解还是不怎么深刻啊
主要是经常忘记 谁·谁=谁
- 1.常用卷积
- 2.常用公式
- 3.杜教筛(进入正题)
我们需要解决的是快速求得 (S(n)=sumlimits_{i=1}^{n}f(i))
考虑构造一个函数 (h) 使得 (h=f*g) (什么你问为什么?我怎么知道背过不就好了)
然后得到了
也就这个柿子了
- 4.例题
(sum)
题意描述:求(sumlimits_{i=1}^{n}varphi(i)) 和 (sumlimits_{i=1}^{n}mu(i))
我们知道 (mu*1=epsilon) 和 (varphi*1=id)
代入柿子就完了
神犇和蒟蒻
题意:求 (sumlimits_{i=1}^{n}varphi(i^2)) 和 (sumlimits_{i=1}^nmu(i^2))
很容易得知第二个柿子只有 (i==1) 时有值,所以答案衡为 (1)
考虑第二个柿子,根据 (varphi(x)=xprodlimits_{i=1}^{k}(1-frac{1}{p_i})) 得 (varphi(x^2)=xvarphi(x))
所以要求的是 (S(n)=sumlimits_{i=1}^{n}ivarphi(i))
推一下:
考虑怎么消掉这个 (d) ,令 (g=id)
再代入柿子就好了
(Lucas)的数论
题意描述:求 (sumlimits_{i=1}^nsumlimits_{j=1}^nd(ij))
我们知道 (f(ij)=sumlimits_{x|i}sumlimits_{y|j}[gcd(x,y)==1])
反演一下:
发现 (sumlimits_{i=1}^{left lfloor frac{n}{d} ight floor}left lfloor frac{n}{id} ight floor)^2) 可以在 (O(sqrt{left lfloor frac{n}{d} ight floor})) 时间内得到
再把前面的 (mu) 杜教筛一下就没了
选数
题意描述:求 ([L,H]) 中选 (N) 个数最大公约数为 (K) 的方案数
这题俩做法啊先说简单的,我们考虑将 (N) 个数都相等和不全相等分开考虑
然后把 (L) 变成 (left lceil frac{L}{K} ight ceil),(H) 变成 (left lfloor frac{H}{K} ight floor)
现在问题变成了从 ([L,H]) 中选 (N) 个不全相同的数使得他们 (gcd) 为 (1)
直接不好计算,考虑容斥
设 (f(x)) 表示 ([L,H]) 中最大公约数为 (x) 的方案数,(F(x)) 表示 ([L,H]) 中最大公约数为 (x) 的倍数的方案数
显然的,有 (f(x)=F(x)-sum_{x|d}f(d),F(x)=(left lfloor frac{H}{x} ight floor-left lfloorfrac{L-1}{x} ight floor)^N)
而如果 (x>H-L) 则 ([L,H]) 中至多有 (1) 种 (x) 的倍数,所以对答案没有贡献
所以从 (H-L) 枚举到 (1) 就行了
复杂度 (O((H-L)ln(H-L)))然后是杜教筛做法
同样把 (L) 变成 (left lceil frac{L}{K} ight ceil),(H) 变成 (left lfloor frac{H}{K} ight floor)
反演一下$$egin{aligned}
&sum_{a=L}^Hsum_{b=L}^H...sum_{k=L}^H[gcd(a,b...k)==1]
&=sum_{a=L}^Hsum_{b=L}^H...sum_{k=L}^Hsum_{d|gcd(a,b...k)}mu(d)
&=sum_{d=1}^{H}mu(d)(left lfloor frac{H}{d} ight floor-left lfloor frac{L-1}{d} ight floor)^N
end{aligned}$$快速幂+杜教筛就没了
(DZY Loves Math IV)
题意描述:求(sumlimits_{i=1}^nsumlimits_{j=1}^mvarphi(ij))
观察到 (n) 很小可以枚举,考虑对于每个 (i) 如何求(sumlimits_{j=1}^mvarphi(ij))
观察 (varphi(x)=xprodlimits_{i=1}^{k}(1-frac{1}{p_i}))
发现我们可以把 (i=prod_{i=1}^kp_i^{e_i}) 分成两部分 (a=prodlimits_{i=1}^kp_i,b=prodlimits_{i=1}^kp_i^{e_i-1})
则 (varphi(i)=bvarphi(a))
设 (f(i,m)=sumlimits_{j=1}^mvarphi(ij))
推一下$$egin{aligned}
f(i,m)&=sumlimits_{j=1}^mvarphi(ij)
&=bsum_{j=1}^mvarphi(aj)
&=bsum_{j=1}^mvarphi(frac{a}{gcd(a,j)})varphi(j)gcd(a,j)
&=bsum_{j=1}^mvarphi(frac{a}{gcd(a,j)})varphi(j)sum_{k|gcd(a,j)}varphi(k)
&=bsum_{j=1}^mvarphi(j)sum_{k|gcd(a,j)}varphi(k)varphi(frac{a}{gcd(a,j)})
&=bsum_{j=1}^mvarphi(j)sum_{k|gcd(a,j)}varphi(frac{a}{k})
&=bsum_{k|a}^mvarphi(frac{a}{k})sum_{j=1}^{m/k}varphi(kj)
&=bsum_{k|a}^mvarphi(frac{a}{k})f(k,frac{m}{k})
end{aligned}$$
边界(f(1,m)=sumlimits_{i=1}^mvarphi(i) , f(n,1)=varphi(n) , f(n,0)=0)
(f(1,m)=sumlimits_{i=1}^mvarphi(i)),可以用杜教筛的方法在一次 (O(m^{frac{2}{3}})) 的时间复杂度内求出,
同时,我们还记忆化了所有 (varphi(leftlfloor frac{m}{n} ight floor)) 的值,所以这个复杂度只需要计算一次。
所以复杂度大概 (O(nsqrt{m}+m^{frac{2}{3}})) 算起来不太对但是跑得还挺快?