• 『你已经见过的无聊数论』


    补充一点数论求和的常用技巧。

    奇怪的技巧

    非常规整除分块

    (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:})

    [Big( (fcdot h) imes (gcdot h) Big)(n)=sum_{d|n}f(d)h(d)gleft( frac{n}{d} ight)hleft(frac{n}{d} ight) \ = h(n)sum_{d|n}f(d)gleft( frac{n}{d} ight)=Big( (f imes g)cdot h Big)(n) ]

    杜教筛

    (mathbf{Question:}) 已知数论函数(f(n)),现在想快速求其前缀和(mathrm{S}_f(n)=displaystylesum_{i=1}^n f(i))

    解决方法是构造( ext{Dirichlet})卷积,不妨将其卷上(g(n)),那么:

    [mathrm{S}_{g imes f}(n)=sum_{i=1}^nsum_{ab=i}f(a)g(b)=sum_{i=1}^ng(i)sum_{j=1}^{lfloor n/i floor} f(j)=sum_{i=1}^ng(i)mathrm{S}_fleft( left lfloor frac{n}{i} ight floor ight) \ mathrm{S}_f(n)g(1)=mathrm{S}_{f imes g}(n)-sum_{i=2}^ng(i)mathrm{S}_fleft( left lfloor frac{n}{i} ight floor ight) ]

    如果(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:})

    [egin{aligned} sum_{i=1}^n ext{lcm}(i,n) & = sum_{i=1}^nfrac{i imes n}{gcd(i,n)} \ & = n imes sum_{d|n} frac{1}{d}sum_{d|i}i[gcd(i,n)=d] \ & = n imessum_{d|n}sum_{i=1}^{n/d}ileft[gcdleft(i,frac{n}{d} ight)=1 ight] \ & = n imessum_{d|n}sum_{i=1}^{n/d}i sum_{k|gcdleft(i,frac{n}{d} ight)}mu(k) \ & = n imes sum_{d|n}sum_{k|frac{n}{d}}mu(k)kmathrm S_1left(frac{n}{dk} ight) \ & = n imes sum_{T|n}mathrm S _1left( frac{n}{T} ight)sum_{k|T}kmu(k) end{aligned} ]

    这样子的贡献式子都可以调和级数地枚举处理,时间复杂度(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)的求和下界比较恶心而解决不了问题,但事实上有简单的处理方法:

    [ ext{let }f(n)=sum_{i=1}^n sum_{k|(i,n)}frac{i imes n}{gcdleft(frac{i}{k},frac{n}{k} ight)} \ f(n)=sum_{k|n}sum_{i=1}^{n/k }frac{i imes k imes n}{gcdleft(i,frac{n}{k} ight)}=sum_{k|n}k^2sum_{i=1}^{n/k}frac{i imes frac{n}{k}}{gcdleft(i,frac{n}{k} ight)}=sum_{k|n}k^2sum_{i=1}^{n/k}mathrm{lcm}left(i,frac{n}{k} ight) ]

    显然(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)),考虑莫比乌斯反演

    [egin{aligned} sum_{i=1}^nsum_{j=1}^n ijgcd(i,j) & = sum_{d=1}^ndsum_{i=1}^{lfloor n/d floor}sum_{j=1}^{lfloor n/d floor}ij[gcd(i,j)=d] \ & = sum_{d=1}^nd^3sum_{i=1}^{lfloor n/d floor}sum_{j=1}^{lfloor n/d floor}ijsum_{k|gcd(i,j)}mu (k) \ & = sum_{d=1}^n d^3sum_{k=1}^{lfloor n/d floor}mu(k)k^2mathrm{S}_1^2left( left lfloor frac{n}{dk} ight floor ight) \ & = sum_{T=1}^nmathrm{S}_1^2left( left lfloor frac{n}{T} ight floor ight) T^2 sum_{d|T}dmuleft( frac{T}{d} ight) \ & = sum_{T=1}^nmathrm{S}_1^2left( left lfloor frac{n}{T} ight floor ight) T^2 varphi(T) = sum_{T=1}^nmathrm{S}_1^2left( left lfloor frac{n}{T} ight floor ight)f(T) end{aligned} ]

    对前式整除分块,考虑用杜教筛快速求(f(T))的前缀和,显然:

    [f=epsilon_2cdot varphiLongleftrightarrow f imes epsilon _2 =epsilon_2cdot (varphi imes au)=epsilon_3 ]

    这里本质上的构造技巧其实是:(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:})

    直接考虑欧拉反演

    [egin{aligned} sum_{i=1}^nsum_{j=1}^n ijgcd(i,j) & = sum_{i=1}^nsum_{j=1}^nijsum_{d|gcd(i,j)} varphi(d) \ & = sum_{d=1}^n varphi(d)d^2mathrm{S}_1^2left( left lfloor frac{n}{d} ight floor ight) end{aligned} ]

    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))种,和左式的值相同。

    那么可以考虑莫比乌斯反演

    [egin{aligned} sum_{i=1}^nsum_{j=1}^m au(ij) & = sum_{i=1}^nsum_{j=1}^msum_{a|i}sum_{b|j} sum_{k|gcd(a,b)} mu(k) \ & = sum _{i=1}^nsum_{j=1}^msum_{k|gcd(i,j)} mu(k)sum_{k|a}sum_{k|b}[a|i][a|j] \ & = sum _{i=1}^nsum_{j=1}^msum_{k|gcd(i,j)} mu(k)sum_{a=1}^{ i/k } sum_{b=1}^{ j/k }left[aBig|frac{i}{k} ight] left[bBig|frac{j}{k} ight] \ & = sum _{i=1}^nsum_{j=1}^msum_{k|gcd(i,j)} mu(k) auleft(frac{i}{k} ight) auleft(frac{j}{k} ight) \ &= sum_{k=1}^{min(n,m)}mu(k) sum_{i=1}^{lfloor n/k floor} au(i)sum_{j=1}^{lfloor m/k floor} au(j) end{aligned} ]

    根据(mu imes I=e)可以用杜教筛求(mu)的前缀和,根据( au imes mu=I^2 imes mu=I imes e=I)可以调用(mu)的杜教筛,然后再次杜教筛求( au)的的前缀和。

    事实上(mathrm S_ au(n))不用再写一个杜教筛,因为:

    [mathrm S_ au(n)=sum_{i=1}^n au(i)=sum_{i=1}^nsum_{j|i}1=sum_{j=1}^nleftlfloor frac{n}{j} ight floor ]

    所以我们可以线性筛(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:})

    让我们先快进到莫比乌斯反演

    [egin{aligned} sum_{i=1}^nsum_{j=1}^neta(gcd(i,j)) & = sum_{i=1}^nsum_{j=1}^n[ mu(gcd(i,j)) = 0 ] \ & = cdotscdots \ & =sum_{T=1}^nleft lfloor frac{n}{T} ight floor ^ 2sum_{d|T}[mu(d)=0]muleft( frac{n}{d} ight) end{aligned} ]

    现在要求函数(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)的前缀和要设法快速求解,那样我们就可以杜教筛。

    一个重要的发现是:

    [mathrm{S}_lambda(n)=sum_{i=1}^n[mu(i)=0]=n-sum_{i=1}^nmu^2(i) ]

    这时候要定义(chi(n)=maxlimits_{d^2|n} d),显然(mu^2(i)=[chi(n)=1]=e(chi(n))),那么对其再次莫比乌斯反演:

    [mathrm{S}_lambda(n)=n-sum_{i=1}^ne(chi(i))=n-sum_{i=1}^nsum_{t|chi(i)}mu(t) \ = n - sum_{i=1}^nsum_{t^2|i}mu(t) = n - sum_{t=1}^{lfloor sqrt{n} floor}mu(t)leftlfloor frac{n}{t^2} ight floor ]

    这个东西直接求时间复杂度是(mathcal O(sqrt n)),不影响杜教筛复杂度,显然也可以优化到(Oleft(n^{frac{1}{3}} ight))

    然而这个东西只能做到(mathcal{O}left(Tn^{frac{2}{3}} ight)),并不是正解。我愿称之为莫比乌斯反演的白给。

    考虑直接容斥,(gcd)没有平方因子的数对是就是:(gcd)至少有一个平方因子的数对数 (-) (gcd)至少有两个平方因子的数对数 (+ cdots)

    写成式子就是:

    [-sum_{i=2}^{lfloor sqrt n floor}mu(i) leftlfloor frac{n}{i^2} ight floor ^ 2 ]

    直接算的话(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})的逆置换,然后开始莫比乌斯反演:

    [egin{aligned} mathbb{E}Big( varphi(a_ua_v)mathrm{dis}(u,v) Big) & = frac{1}{n imes (n+1)}sum_{i=1}^nsum_{j=1}^nvarphi(a_ia_j)mathrm{dis}(i,j) \ sum_{i=1}^nsum_{j=1}^nvarphi(a_ia_j)mathrm{dis}(i,j) & = sum_{i=1}^nsum_{j=1}^nfrac{varphi(a_i)varphi(a_j)gcd(a_i,a_j)}{varphi(gcd(a_i,a_j))} imes mathrm{dis}(i,j) \ & = cdotscdots \ & = sum_{T=1}^nleft( sum_{d|T}frac{d}{varphi(d)}muleft( frac{T}{d} ight) ight)sum_{i=1}^{lfloor n/T floor}sum_{j=1}^{lfloor n/T floor} varphi(iT)varphi(jT)mathrm{dis}(b_{iT},b_{jT}) end{aligned} ]

    (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...})

  • 相关阅读:
    Pytorch-实战之对Himmelblau函数的优化
    Pytorch-tensor的感知机,链式法则
    Pytorch-tensor的激活函数
    Pytorch-tensor的分割,属性统计
    Pytorch-tensor的转置,运算
    Pytorch-tensor维度的扩展,挤压,扩张
    Transformer代码细节
    Leetcode 1494
    格雷码
    两个正序数组的中位数
  • 原文地址:https://www.cnblogs.com/Parsnip/p/14020658.html
Copyright © 2020-2023  润新知