• 莫比乌斯反演与杜教筛


    侵删
    以下内容均来自TA爷课件,我只是改了几个小的地方qwq
    请关闭浏览器的极速模式后阅读(极速模式显示的公式为什么辣么粗糙啊qwq)

    枚举除法

    1. (leftlfloorfrac{n}{i} ight floor)只有(Oleft(sqrt{n} ight))种取值。
    2. 对于(i)(leftlfloorfrac{n}{leftlfloorfrac{n}{i} ight floor} ight floor)是与(i)(n)除并下取整取值相同的一段区间的右端点。
    3. 一个很有用的性质:(leftlfloorfrac{n}{ab} ight floor=leftlfloorfrac{leftlfloorfrac{n}{a} ight floor}{b} ight floor=leftlfloorfrac{leftlfloorfrac{n}{b} ight floor}{a} ight floor)
    4. 上取整也有3所述的性质。

    积性函数

    1. (f(ab)=f(a)f(b),(a,b)=1)
    2. 完全积性:不要求((a,b)=1)
    3. 考虑时一般会考虑成(f(x)=prodlimits_{i}fleft(p_i^{k_i} ight))
    4. (f)不是0的常值函数时,(f(1)=1)
    5. 积性函数的狄利克雷前缀和也是积性函数。

    [s(n)=sumlimits_{d|n}f(d)=prodlimits_{i}sumlimits_{j=0}^{k_i}fleft(p_i^j ight) ]

    1. 两个积性函数的狄利克雷卷积也是积性函数。

    [c(n)=sumlimits_{d|n}a(d)bleft(frac{n}{d} ight)=prodlimits_{i}sumlimits_{j=0}^{k_i}aleft(p_i^j ight)bleft(p_i^{k_i -j} ight) ]

    1. 积性函数可以线性筛出。线筛可以找到每个数(x)的最小质因子(p_1)及其次数(k_1)。如果我们能以较小的代价((O(1)))求出(fleft(p_1^{k_1} ight)),便可以线筛了。

    初等积性函数(mu)

    1. 栗子:给定(n)(m),求(sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[iot j],n,m leqslant 10^9),不用(mu)怎么做?
      容斥!设dp数组(f(i,j))为当(n=i,m=j)时的答案。

    [f(n,m)=nm-sumlimits_{i=2}^{min(n,m)}fleft(leftlfloorfrac{n}{i} ight floor,leftlfloorfrac{m}{i} ight floor ight) ]

    时间复杂度(Oleft(sumlimits_{i=1}^{leftlfloorsqrt{n} ight floor}left(sqrt{leftlfloorfrac{n}{i} ight floor}+sqrt{i} ight) ight)=Oleft(n^{frac{3}{4}} ight))
    那么(mu)是什么?就是容斥系数!

    [mu(1)=1,mu(2)=-1,mu(3)=-1,mu(4)=0,mu(5)=-1dots ]

    [mu(n)=left{egin{array}{rcl}0&,&exists x^2|n\(-1)^k&,&n=prodlimits_{i=1}^{k}p_iend{array} ight. ]

    (mu)显然是一个积性函数。
    2. $$sumlimits_{d|n}mu(d)=left{egin{array}{rcl}1&,&n=1&,&n eq1end{array} ight.$$
    3. 莫比乌斯反演

    [F(n) =sumlimits_{d|n}f(d) ]

    [f(n) =sumlimits_{d|n}F(d)muleft(frac{n}{d} ight)=sumlimits_{d|n}f(d)sumlimits_{g|frac{n}{d}}mu(g)=f(n) ]

    [F(n) =sumlimits_{n|d}f(d) ]

    [f(n) =sumlimits_{n|d}F(d)muleft(frac{d}{n} ight)=sumlimits_{n|d}f(d)sumlimits_{g|frac{d}{n}}mu(g)=f(n) ]

    1. 回到栗子:

    [sumlimits_{i=1}^nsumlimits_{j=1}^m[iot j]=sumlimits_{i=1}^nsumlimits_{j=1}^msumlimits_{d|(i,j)}mu(d)=sumlimits_{d=1}^{min(n,m)}mu(d)leftlfloorfrac{n}{d} ight floorleftlfloorfrac{m}{d} ight floor ]

    当然这样还是做不了。。。
    所以我们需要杜教筛!(后面再说吧。。)
    不过大多数(mu)的题(第一步)这么化,所以这个式子还是比较重要的。

    初等积性函数(varphi)

    1. (varphi(n)=1~n与n互质的数的个数)
      所以由定义便可直接写出:

    [varphi(n)=sumlimits_{d|n}mu(d)frac{n}{d}=prodlimits_{i}sumlimits_{j=0}^{k_i}muleft(p_i^j ight)p^{k_i -j}=prodlimits_{i}p_i^{k_i -1}(p_i -1) ]

    这样就可以线筛出来了,而且可以看出(varphi)是一个积性函数。
    2. 从刚才的式子可以看出,(varphi)完全可以用(mu)代替,那么我们为什么需要(varphi)呢?
    很大一部分原因是它定义比较直观,比较容易想到。
    3. (varphi)的性质:$$sumlimits_{d|n}varphi(d)=sumlimits_{d|n}dsumlimits_{g|frac{n}{d}}mu(g)=n$$
    4. 栗子:求(sumlimits_{i=1}^nsumlimits_{j=1}^m(i,j)),多组数据,(t,n,mleqslant 10^5)

    [ans=sumlimits_{i=1}^{min(n,m)}varphi(i)leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{i} ight floor ]

    杜教筛

    1. (sumlimits_{i=1}^nmu(i),nleqslant 10^{11})
      直接求不好求,但是我们有(sumlimits_{i=1}^nsumlimits_{d|i}mu(d)=1)
      化一下蛤:(sumlimits_{i=1}^nsumlimits_{j=1}^{leftlfloorfrac{n}{i} ight floor}mu(j)=1)(sumlimits_{i=1}^nmu(i)=1-sumlimits_{i=2}^nsumlimits_{j=1}^{leftlfloorfrac{n}{i} ight floor}mu(j))
      核心思想是枚举约数,这样就可以递推/递归求解了。
      时间复杂度(Oleft(n^{frac34} ight))
      但是注意到当(n)比较小的时候其实我们可以(O(n))线筛出来。
      所以我们考虑分类讨论,线筛出≤B的,>B的递推。
      时间复杂度(Oleft(B+sumlimits_{i=1}^{frac nB}sqrt{frac ni} ight)=Oleft(B+frac n{sqrt{B}} ight))
      求导一下可知在(B=n^{frac23})时取得最小值(Oleft(n^frac23 ight))
    2. 回到栗子:这样的话最初的栗子就会做了吧~

    [sum_{i=1}^nsum_{j=1}^m[iot j]=sum_{i=1}^nsum_{j=1}^msum_{d|(i,j)}mu(d)=sum_{d=1}^{min(n,m)}mu(d)leftlfloorfrac nd ight floorleftlfloorfrac md ight floor ]

    注意到杜教筛的时候不仅是求出了(sumlimits_{j=1}^nmu(j)),还顺便求出了所有的(sumlimits_{j=1}^{leftlfloorfrac ni ight floor}mu(j)),所以可以和普通的枚举除法完美契合。
    3. 那么怎么求(sumlimits_{i=1}^nvarphi(i))

    [frac{n(n+1)}2=sum_{i=1}^nsum_{d|i}varphi(d)=sum_{i=1}^nsum_{j=1}^{leftlfloorfrac ni ight floor}varphi(j) ]

    下面讲些题吧~(不一定都是反演哦)

    1. (sumlimits_{i=1}^nsumlimits_{j=1}^mlcm(i,j))(n,mleq10^{11})

    [egin{aligned}&sum_{i=1}^nsum_{j=1}^mlcm(i,j)\=&sum_{i=1}^nsum_{j=1}^mfrac{ij}{(i,j)}\=&sum_{i=1}^{min(n,m)}isum_{j=1}^{minleft(leftlfloorfrac ni ight floor,leftlfloorfrac mi ight floor ight)}mu(j)j^2frac{leftlfloorfrac n{ij} ight floorleft(leftlfloorfrac n{ij} ight floor+1 ight)}2frac{leftlfloorfrac m{ij} ight floorleft(leftlfloorfrac m{ij} ight floor+1 ight)}2end{aligned} ]

    如果我们可以杜教筛出(sumlimits_{i=1}^nmu(i)i^2),就可以做到(Oleft(n^{frac34} ight))
    这是可以的

    [1=sum_{i=1}^nsum_{d|i}mu(d)d^2left(frac id ight)^2=sum_{i=1}^ni^2sum_{j=1}^{lfloorfrac ni floor}mu(j)j^2 ]

    但是我们当然不必这么做。
    可以直接令(f(n,m))表示(1n,1m)中所有互质数对乘积和。
    那么(f(n,m)=frac{n(n+1)m(m+1)}4-sumlimits_{i=2}^{min(n,m)}i^2fleft(leftlfloorfrac ni ight floor,leftlfloorfrac mi ight floor ight)),直接dp就好了。
    但是我们需要(Oleft(n^frac 23 ight))

    [sum_{i=1}^{min(n,m)}frac{leftlfloorfrac ni ight floorleft(leftlfloorfrac ni ight floor+1 ight)leftlfloorfrac mi ight floorleft(leftlfloorfrac mi ight floor+1 ight)}4isum_{d|i}mu(d)d ]

    枚举除法,我们便只需求(sumlimits_{i=1}^nisumlimits_{d|i}mu(d)d)
    它等于(sumlimits_{i=1}^nisumlimits_{j=1}^{leftlfloorfrac ni ight floor}mu(j)j^2)
    我们先求出(sumlimits_{i=1}^nmu(i)i^2)
    这个刚才已经讲过了。
    然后前者便可以预处理+直接求。
    预处理的时候需要线性筛

    [sum_{d|n}mu(d)d=prod_ileft(1-p_i ight) ]

    这题中涉及一种很重要的杜教筛的思路。
    就是对于不能直接杜教筛的式子,可以将其与另一个前缀和易求的积性函数狄利克雷卷积,使得卷积后的函数前缀和也易求。
    比如这道题就是与(f(x)=x^2)卷积。
    这道题也涉及到一些常见的化式子的方法。
    (gcd omu)(mu ovarphi)
    对于i,j,ij三项贡献的这种,可以枚举ij将其化为狄利克雷卷积,也可以枚举i和j化成带下取整的式子;一般来讲前者往往易于预处理,可以应付多组询问,后者则在单次询问中有优秀表现。
    2. SDOI2015 约数个数和
    (sumlimits_{i=1}^nsumlimits_{j=1}^md(i,j)),多组数据,(T,n,mleq10^5)(d(i,j)=sumlimits_{x|i}sumlimits_{y|j}[xot y])

    [egin{aligned}&sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}[xot y]\=&sum_{i=1}^nsum_{j=1}^mleftlfloorfrac ni ight floorleftlfloorfrac mj ight floorsum_dmu(d)[d|i][d|j]\=&sum_{d=1}^{min(n,m)}mu(d)left(sum_{i=1}^{leftlfloorfrac nd ight floor}leftlfloorfrac{leftlfloorfrac nd ight floor}i ight floor ight)left(sum_{j=1}^{leftlfloorfrac md ight floor}leftlfloorfrac{leftlfloorfrac md ight floor}j ight floor ight)end{aligned} ]

    预处理(Oleft(nlog n ight)/Oleft(nsqrt n ight)),查询(Oleft(Tsqrt n ight))
    3. BZOJ2820 YY的gcd
    ((x,y)=质数)(xin[1,n])(yin[1,m])的数对个数。多组数据,(n,mleq10^7)(Tleq10^4)

    [egin{aligned}&sum_{pleq min(n,m)}sum_{i=1}^{leftlfloorfrac np ight floor}sum_{j=1}^{leftlfloorfrac mp ight floor}[iot j]\=&sum_{pleq min(n,m)}sum_{i=1}^{leftlfloorfrac np ight floor}sum_{j=1}^{leftlfloorfrac mp ight floor}sum_dmu(d)[dot i][dot j]\=&sum_{i=1}^nleftlfloorfrac ni ight floorleftlfloorfrac mi ight floorsum_{p|i}muleft(frac ip ight)end{aligned} ]

    预处理(O(n)/O(nlglg n)),查询(O(Tsqrt n))
    4. FZU2016 how many tuples
    有m个数,第i个数的取值范围是([1,a_i]),求这m个数gcd为1的方案数。多组数据,10s时限,(tleq10^3)(mleq20)(aileq10^8)

    [sum_{i=1}^{min(a_i)(1leq ileq m)}mu(i)prod_{j=1}^mleftlfloorfrac{a_j}i ight floor ]

    直接杜教筛就可以了,杜教筛的时候预处理(10^7)
    枚举除法的时候需要用堆。时间复杂度(Oleft(Tmsqrt Alog m ight))
    5. CQOI2015 选数
    求从(left[L,R ight])中选N个数,其gcd等于K的方案数。(N,K,L,Rleq10^9)(R-Lleq10^5)
    如果N个数互不相同,那么gcd至多是R-L,所以我们分情况讨论。
    所以设(f(i))表示gcd是K*i的方案数,要求(leftlfloorfrac R{iK} ight floor-leftlfloorfrac{L-1}{iK} ight floor>1)

    [f(i)=left(leftlfloorfrac R{iK} ight floor-leftlfloorfrac{L-1}{iK} ight floor ight)^N-sum_{j=2}^{leftlfloorfrac RK ight floor-1}f(ij) ]

    最后再加上([Lleq Kleq R])
    时间复杂度(Oleft((R-L)log K ight))

  • 相关阅读:
    LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]
    LeetCode 15 3Sum [sort] <c++>
    LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>
    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
    LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++>
    将博客搬至CSDN
    leetcode
    (转载) 图像领域常用资源
    Unity3D 之 C# 脚本
    Kinect 人机交互开发实践
  • 原文地址:https://www.cnblogs.com/abclzr/p/6242020.html
Copyright © 2020-2023  润新知