zoukankan      html  css  js  c++  java
  • min_25筛

    目录

    目录地址

    上一篇

    下一篇


    min_25 筛思想

    min_25 筛将求积性函数的前缀和分为质数的贡献和非质数的贡献,最后求和。

    这样,我们可以通过先求出质数的贡献,再利用质数贡献反算出合数的贡献,从而快速求和

    要让 min_25 筛实现,只需要积性函数 (oldsymbol f) 在质数的整数次方出能快速计算即可


    min_25 筛的质数贡献

    考虑 (displaystyle ans=sum_{i=1}^noldsymbol f(i))

    我们现在设几个新的函数 (oldsymbol f'_k(n)) ,满足以下性质:

    1. (forall oldsymbol f'_k) 为完全积性函数
    2. (sumoldsymbol f'_k(p)=oldsymbol f(p))
    3. (forall oldsymbol f'_k) 可快速求和

    那么,由于 (displaystyle sum_{i=1}^n[iin Prime]oldsymbol f(i)=sum_{i=1}^n[iin Prime](sum oldsymbol f'_k)(i)=sum sum_{i=1}^n[iin Prime]oldsymbol f'_k(i))

    因此,我们的问题转化为了求解 (displaystyle sum_{i=2}^n[iin Prime]oldsymbol f'_k(i))

    我们记 (displaystyle g(n,j)=sum_{i=2}^n[iin Primevee fc_i>p_j]oldsymbol f'_k(i))

    其中 (Prime)([1,n]) 中的质数集合, (p_j)(Prime) 内第 (j) 小的数(即第 (j) 个质数), (fc_i)(i) 的最小质因数

    因此 (g(n,j)) 表示的是,质数和最小质因数大于 (p_j) 的数的贡献

    很显然,我们要求的 (displaystyle sum_{i=2}^n[iin Prime]oldsymbol f'_k(i)=g(n,Card(Prime) ))

    (Card(A)) 表示集合 (A) 的元素数量

    而初始状态,则为 (displaystyle g(n,0)=sum_{i=2}^n[iin Primevee fc_i>p_0]oldsymbol f'_k(i)=sum_{i=2}^noldsymbol f'_k(i)=sum_{i=1}^noldsymbol f'_k(i)-oldsymbol f'_k(1)=sum_{i=1}^noldsymbol f'_k(i)-1)

    由于 (oldsymbol f'_k) 的前缀和能快速求解,所以 (g(n,0)) 是能快速求解的

    接下来我们考虑怎么从 (g(n,0)) 递推至 (g(n,Card(Prime) ))

    当从 (g(n,m-1)) 递推至 (g(n,m)) 时,我们需要删去最小质因数为 (p_m) 的合数的贡献

    首先,当 (p_m>sqrt n) 时,一定是没有任何合数满足最小质因数为 (p_m) 这一条件的

    因此 (g(n,m)=g(n,m-1))

    对于剩余的情况,我们是要删去最小质因数为 (p_m) 的合数

    而对于所有最小质因数为 (p_m) 的合数,一定是 (p_m) 乘上一个最小质因数大于 (p_{m-1}) 的数(注意,这边质数也是符合条件的)

    所以这些 (fc_i=p_m) 的合数的 (oldsymbol f'_k) 值,一定可以写成 (displaystyle sum_{i=2}^{p_mcdot ileq n}oldsymbol f'_k(p_mcdot i)[fc_i>p_{m-1}])

    由于 (oldsymbol f'_k) 为完全积性函数,所以我们可以把这个展开 (displaystyle sum_{i=2}^{ileq n/p_m}oldsymbol f'_k(p_m)cdot oldsymbol f'_k(i)[fc_i>p_{m-1}]=oldsymbol f'_k(p_m)cdot sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]oldsymbol f'_k(i))

    我们这边用一个很巧妙的转化: (displaystyle sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]oldsymbol f'_k(i)=sum_{i=2}^{n/p_m}[fc_i>p_{m-1}vee iin Prime]oldsymbol f'_k(i)-sum_{i=1}^{m-1}oldsymbol f'_k(p_i))

    前一个求和号即为 (g(n/p_m,m-1)) ,后面那个求和号我们记为 (Sp(m-1)) ,由于 (p_i<p_mleq sqrt n) 我们可以线筛处理

    因此,带回去,我们从 (g(n,m-1)) 转移到 (g(n,m)) 应该减去 (oldsymbol f'_k(p_m)(g(n/p_m,m-1)-Sump(m-1) ))


    最后我们总结一下思路:

    先线筛出 (oldsymbol f'_k)(sqrt n) 内的函数值、质数前缀和

    然后利用递推式:(g(n,m)=egin{cases} g(n,m-1),p_m^2> n \ \ g(n,m-1)-oldsymbol f'_k(g(n/p_m,m-1)-Sp(m-1) ),p_m^2leq n end{cases})

    由于 (n/d) 的取值只有 (2sqrt n) 个,我们只需要处理这 (2sqrt n) 的取值即可,而且第二维还能利用滚动出去空间上的开销

    于是,质数的贡献 (displaystyle sum_{i=1}^n[iin Prime]oldsymbol f(i)) 只需要对我们求出来的求和即可求出

    这一部分的复杂度经证明为 (O({n^{3over 4}over log n}))


    min_25 筛的总贡献

    接下来我们考虑如何求解我们想要的 (displaystyle ans=sum_{i=1}^noldsymbol f(i))

    我们设 (displaystyle S(n,m)=sum_{i=2}^n[fc_igeq p_m]oldsymbol f(i))(ans=S(n,1)+oldsymbol f(1)=S(n,1)+1)

    而我们还是思考如何递推求得 (S(n,1))

    首先,对于 (p_{m-1}^2leq nleq p_m^2) ,很容易得到

    (displaystyle S(n,m)=sum_{i=2}^n[fc_igeq p_m]oldsymbol f(i)=sum_{i=2}^n[iin Primevee igeq p_m]oldsymbol f(i)=sum_{i=2}^n[iin Prime]oldsymbol f(i)-sum_{i=2}^{m-1}oldsymbol f(p_i))

    前面那个求和号我们刚刚求出来了,后面那个求和号实际上就算 (Sump(m-1)) ,能快速求出

    考虑从 (S(n,m+1)) 递推至 (S(n,m)) 肯定会增加,增加的是最小质因数为 (p_m) 的贡献

    (displaystyle sum_{i=2}^n[fc_i=p_m]oldsymbol f(i))

    把它分为质数和合数考虑,如果是合数,再按质因数中含多少 (p_m) 处理:

    当质因数中含 (e)(p_m) 的,我们考虑它的贡献为

    (displaystyle sum_{i=2}^n[p_m^emid nwedge p_m^{e+1} mid n]oldsymbol f(i)=oldsymbol f(p_m^e)+sum_{i=2}^{p_m^ecdot ileq n}[fc_i>p_m]oldsymbol f(p_m^ecdot i)=oldsymbol f(p_m^e)+sum_{i=2}^{n/p_m^e}[fc_igeq p_{m+1}]oldsymbol f(p_m^e)cdot oldsymbol f(i)=oldsymbol f(p_m^e)+oldsymbol f(p_m^e)cdot sum_{i=2}^{n/p_m^e}[fc_igeq p_{m+1}]oldsymbol f(i))

    根据定义,很明显可以发现,求和号就是 (S(n/p_m^e,m+1))

    因此,对于质因数含有 (e)(p_m) 的,对 (S(n,m+1)) 递推至 (S(n,m)) 的贡献为 (oldsymbol f(p_m^e)+oldsymbol f(p_m^e)cdot S(n/p_m^e,m+1))

    所以由 (S(n,m+1)) 递推至 (S(n,m)) 的贡献为 (displaystyle sum_{e=1}^{p_m^eleq n}(oldsymbol f(p_m^e)cdot S(n/p_m^e,m+1)+f(p_m^{e+1}) ))

    (displaystyle S(n,m)=sum_{i=2}^n[iin Prime]oldsymbol f(i)-Sump(m-1)+sum_{i=j}^{p_i^2leq n}sum_{e=1}^{p_i^eleq n}(oldsymbol f(p_i^e)cdot S(n/p_i^e,i+1)+oldsymbol f(p_i^{e+1}) ))

    由于第二维没办法滚动,记忆化难度较大,因此,只能递归求解

    经证明,复杂度为 (O(n^{1-varepsilon}))

    这个复杂度是比较神奇的,其表明当 (n) 趋近于无穷大的时候,复杂度会无限接近于 (O(n))

    但这并不表明它是 (O(n)) 的,事实上,好像绝大部分情况下都跑得比洲阁筛更快

    因此,min_25 筛的总复杂度为 (O({n^{3over 4}over log n}+n^{1-varepsilon}))

  • 相关阅读:
    继续学习AJAX
    最近在看AJAX
    selenium学习模拟键盘按键操作
    二十三。克隆
    二十五。继承
    十八。类的属性
    二十一。第四章综合例题
    二十四。继承
    十七。对JAVA中堆和栈的细致了解
    十六。方法调用以及传参
  • 原文地址:https://www.cnblogs.com/JustinRochester/p/12522040.html
Copyright © 2011-2022 走看看