补充一点数论求和的常用技巧。
奇怪的技巧
非常规整除分块
(mathbf{Question:}) (nleq 10^{18}),求(displaystyle sum_{i=1}^{leftlfloor sqrt n ight floor}leftlfloor dfrac{n}{i^2} ight floor)。
回顾一下一般的整除分块,当(iinleft[x, leftlfloor dfrac{n}{ lfloor n/x floor } ight floor ight])时,(leftlfloor dfrac{n}{i} ight floor)的值均为(leftlfloor dfrac{n}{x} ight floor),那么显然想到用(i^2)取代换(i),得到:
当(i^2inleft[x, leftlfloor dfrac{n}{ lfloor n/x floor } ight floor ight])时,(leftlfloor dfrac{n}{i^2} ight floor)的值都为(leftlfloor dfrac{n}{x} ight floor),显然可以解出(iinleft[sqrt x,sqrt{leftlfloor dfrac{n}{ lfloor n/x floor } ight floor} ight])。
于是每次得到一个左边界(l)作为(sqrt x),然后计算出右边界就可以整除分块了。
for (ll l = 1, r; l * l <= n; l = r + 1)
r = sqrt( n / (n/l/l) ), Sum += ( r - l + 1 ) * ( n / l / l )
数论卷积的分配律
已知(f(n),g(n))是数论函数,(h(n))是完全积性函数,那么:((fcdot h) imes (gcdot h)=(f imes g)cdot h)。
(mathbf{Proof:})
杜教筛
(mathbf{Question:}) 已知数论函数(f(n)),现在想快速求其前缀和(mathrm{S}_f(n)=displaystylesum_{i=1}^n f(i))。
解决方法是构造( ext{Dirichlet})卷积,不妨将其卷上(g(n)),那么:
如果(mathrm{S}_{f imes g}(n))可以和(mathrm{S}_g(n))可以快速求的话,那么我们就可以对上式整除分块,时间复杂度(mathcal Oleft(n^lambda+n^{1-frac{lambda}{2}} ight)),(n^lambda)为线性预处理的前缀和数量,一般来说取(lambda=dfrac{2}{3}),时间复杂度为(mathcal Oleft(n^{frac{2}{3}} ight )),代码要结合(mathrm{Hash})表记忆化。
(mathbf{Proof:})
对于一个固定的(n),本质上杜教筛求出了所有(mathrm{S}_fleft(leftlfloordfrac{n}{t} ight floor ight)(tin[1,n]))的值(这一部分的值只有(mathcal O(sqrt n))个,分别是(1sim sqrt n)和(sqrt {dfrac{n}{1}}simsqrt {dfrac{n}{sqrt n}})),并且当(mathrm{S}_fleft(leftlfloordfrac{n}{t} ight floor ight)(tin[2,n]))的值已知的时候,求(mathrm{S}_f(n))的值是(O(sqrt n))的,所以我们可以得到:
[T(n) = mathcal O(sqrt n)+ sum_{t=1}^{sqrt n}Tleft(sqrt t ight)+Tleft( sqrt{frac{n}{t}} ight) ]然而,我们只需将递归式向下展开一层即可计算。因为再向下展开也是(leftlfloordfrac{n}{t} ight floor)的形式,根据记忆化搜索,只会计算一次,于是总时间复杂度的表达式形如:
[egin{aligned} T(n) & = mathcal O(sqrt n)+ sum_{t=1}^{sqrt n}mathcal Oleft(sqrt t ight)+mathcal Oleft( sqrt{frac{n}{t}} ight) \ & sim mathcal Oleft( int_1^{sqrt n}sqrt t+ sqrt{frac{n}{t}} ext dt ight) = mathcal Oleft(n^{frac{3}{4}} ight) end{aligned} ]如果线性筛处理出(n^{lambda}left(lambdageq dfrac{1}{2} ight))个值,那么时间复杂度就可以优化到:
[T(n)=mathcal O(n^{lambda})+ sum_{t=1}^{n^{1-lambda}}mathcal Oleft(sqrt{frac{n}{t}} ight)sim mathcal Oleft(int_{1}^{n^{1-lambda}}sqrt{ frac{n}{t} } ext d t ight)=mathcal Oleft( n^{lambda}+ n^{1-frac{lambda}{2}} ight) ]
上面的复杂度分析默认(mathrm{S}_{f imes g}(n))和(mathrm{S}_g(n))都可以(mathcal O(1))求,事实上没有(mathrm{S}_{f imes g}(n))没有必要,只要求的时间不超过(mathcal Oleft(n^{frac{2}{3}} ight))就不影响整体复杂度,例如可以再嵌套一个杜教筛。
例题
SPOJ LCMSUM / HDU 4944
(mathbf{Question1:}) (nleq 10^6,Tleq 3 imes 10^5),求(displaystyle sum_{i=1}^nmathrm{lcm}(i,n))。
(mathbf{Solution:})
这样子的贡献式子都可以调和级数地枚举处理,时间复杂度(mathcal O(nlog n))。
(mathbf{Question2:}) (n,Tleq 5 imes 10^5),求(displaystyle sum_{i=1}^nsum_{j=i}^nsum_{d|(i,j)}frac{ij}{gcdleft(frac{i}{d},frac{j}{d} ight)})。
(mathbf{Solution:})
降智思维题。如果直接开始推的话最后会因为(j)的求和下界比较恶心而解决不了问题,但事实上有简单的处理方法:
显然(f)是上一题那个函数和(epsilon_2)的(mathrm{dirichlet})卷积,也可以(mathcal O(nlog n))刷表,那么原式就是(displaystyle sum_{i=1}^n f(n)),可以(mathcal O(1))回答询问。
简单的数学题
(mathbf{Question:}) (nleq 10^{10}),求(displaystyle sum_{i=1}^nsum_{j=1}^n ijgcd(i,j))。
(mathbf{Solution1:})
令(mathrm{S}_k(n)=displaystyle sum_{i=1}^ni^k),(f(T)=T^2varphi(T)),考虑莫比乌斯反演
对前式整除分块,考虑用杜教筛快速求(f(T))的前缀和,显然:
这里本质上的构造技巧其实是:(epsilon_k imes epsilon_k = au cdot epsilon_k),显然(displaystyle sum_{i=1}^nepsilon_2(i)=dfrac{n(n+1)(2n+1)}{6},sum_{i=1}^nepsilon_3(i)=dfrac{n^2(n+1)^2}{4})都是很好求的,所以可以杜教筛。
(mathbf{Solution2:})
直接考虑欧拉反演
Lucas的数论
(mathbf{Question:}) (n,mleq 10^{9}),求(displaystyle sum_{i=1}^nsum_{j=1}^m au(ij)),其中( au(ij)=sigma_0(ij))表示约数个数。
(mathbf{Solution:})
一个关于积性函数在两数之积处取值的有趣式子:( au(nm)=displaystylesum_{i|n}sum_{j|m}[gcd(i,j)=1])。
(mathbf{Proof:})
不妨设(n=displaystyle prod_{i=1}^k p_i^{alpha_i},m=prod_{i=1}^n p_i^{eta_i},nm=prod_{i=1}^kp_i^{alpha_i+eta_i}),根据算术基本定理,( au(nm)=displaystyle prod_{i=1}^k(alpha_i+eta_i+1))。
设(i=displaystyle prod_{i=1}^k p_i^{u_i},m=prod_{i=1}^n p_i^{v_i}),观察右式,注意到
[sum_{i|n}sum_{j|m}[gcd(i,j)=1]=sum_{i|n}sum_{j|m}prod_{t=1}^k [ u_t = 0 ext{ or } v_t = 0 ] ]当(u_t=0)时,显然(v_t)有(eta_t+1)种取值,当(v_t=0)时,显然(u_t)有(alpha_t+1)种取值,两者同时取零被算重,所以右式的值总共有(displaystyle prod_{i=1}^k(alpha_i+eta_i+1))种,和左式的值相同。
那么可以考虑莫比乌斯反演
根据(mu imes I=e)可以用杜教筛求(mu)的前缀和,根据( au imes mu=I^2 imes mu=I imes e=I)可以调用(mu)的杜教筛,然后再次杜教筛求( au)的的前缀和。
事实上(mathrm S_ au(n))不用再写一个杜教筛,因为:
所以我们可以线性筛(mathcal Oleft(n^{frac{2}{3}} ight))个前缀和,然后剩下的整除分块计算,时间复杂度也是(mathcal Oleft(n^{frac{2}{3}} ight))。(不预处理直接暴力的话也是和杜教筛的时间复杂度分析一样的,是(mathcal Oleft(n^{frac{3}{4}} ight)))
最简根式
(mathbf{Question:}) (nleq 10^{12}),求(displaystyle sum_{i=1}^nsum_{j=1}^n eta(gcd(i,j))),其中(eta(n)=egin{cases} 0, & n ext{ is a square-free number}, \ 1, & ext{otherwise} end{cases})。
(mathbf{Solution:})
让我们先快进到莫比乌斯反演
现在要求函数(f(n)=displaystyle sum_{d|n}[mu(d)=0]muleft(frac{n}{d} ight))的前缀和,就可以对原式整除分块。不妨考虑( ext{dirichlet})卷积,设(lambda(n)=[mu(n)=0]),那么(f = lambda imes muRightarrow f imes I=lambda imes e),显然(I)的前缀和是好求的,(lambda imes e=lambda)的前缀和要设法快速求解,那样我们就可以杜教筛。
一个重要的发现是:
这时候要定义(chi(n)=maxlimits_{d^2|n} d),显然(mu^2(i)=[chi(n)=1]=e(chi(n))),那么对其再次莫比乌斯反演:
这个东西直接求时间复杂度是(mathcal O(sqrt n)),不影响杜教筛复杂度,显然也可以优化到(Oleft(n^{frac{1}{3}} ight))。
然而这个东西只能做到(mathcal{O}left(Tn^{frac{2}{3}}
ight)),并不是正解。我愿称之为莫比乌斯反演的白给。
考虑直接容斥,(gcd)没有平方因子的数对是就是:(gcd)至少有一个平方因子的数对数 (-) (gcd)至少有两个平方因子的数对数 (+ cdots)
写成式子就是:
直接算的话(mathcal Oleft(sqrt n + Tn^{frac{1}{3}} ight)),结合杜教筛优化到(mathcal Oleft(Tleft(n^{frac{1}{2} imes frac{2}{3}}+n^{frac{1}{3}} ight) ight)=mathcal O left(Tn^{frac{1}{3}} ight)).
CF809E Surprise me!
(mathbf{Question:}) 给定一棵树,点有点权(a_i),({a_i})是一个(1sim n)的排列,随机选点(u,v(u ot = v)),求(mathbb{E}Big( varphi(a_ua_v)mathrm{dis}(u,v) Big)),(nleq 2 imes 10^5)。
(mathbf{Solution:})
考虑积性函数(varphi)在两数之积处的取值,可知:(varphi(ab)=dfrac{varphi(a)varphi(b)gcd(a,b)}{varphi(gcd(a,b))})。
记(b_{a_i}=i)为排列({a_i})的逆置换,然后开始莫比乌斯反演:
令(zeta=(epsiloncdot varphi ^{-1} ) imes mu),显然可以(mathcal O(nlog n))预处理。显然可以枚举每一个(T),把点集(S(T)={b_{kT}|kin N^+})拿出来染色,那么问题转化成了:
有(n)种颜色,每种颜色有权值(v_i),现在有(mathcal O(nlog n))次染色,如果用(mathcal C(i))表示点(i)被染过的颜色的集合,求(displaystyle sum_{c=1}^nsum_{i=1}^nsum_{j=1}^nmathrm{dis}(i,j)varphi(a_i)varphi(a_j)v_c[cin mathcal C(i)][cin mathcal C(j)])。
显然可以用桶来维护同色贡献,然后就大力拆贡献点分吧(比虚树dp好写好想多了)。
(mathbf{continuously updating...})