zoukankan      html  css  js  c++  java
  • Meissel-Lehmer算法 学习笔记

    定义(pi_k(n))为质数的(k)次幂前缀和函数,即(pi_k(n)=sum_{1leq ileq pi(n)}p^k)。特别地,(pi_0(n)=pi(n)),为质数计数函数。求(pi_k(n))

    解法

    (若无特殊说明,下文中单独出现的(p)(q)均为质数)

    定义

    • (delta(x))(x)的最小质因子,(gamma(x))(x)的最大质因子。

    • (cnt(x))(x)的质因子个数。

    • (S_k(n))为自然数幂和函数。(S_k(n)=sum_{1leq ileq n}i^k)

    • (phi_k)为部分筛函数。(phi_k(n,a)=sum_{substack{1leq xleq n\ delta(x)> p_a}}x^k)

    • (P_{s,k}(n,a)=sum_{substack{1leq xleq n\ delta(x)> p_a\ cnt(x)=s}}x^k)

    那么

    [phi_k(n,a)=sum_{sgeq 0}P_{s,k}(n,a) ]

    考虑素数(B=p_a),当(n^frac{1}{3}leq Bleq n^frac{1}{2})时,有

    [phi_k(n,a)=P_{0,k}(n,a)+P_{1,k}(n,a)+P_{2,k}(n,a)=1+pi_k(n)-pi_k(p_a)+P_{2,k}(n,a) ]

    于是

    [pi_k(n)=phi_k(n)-P_{2,k}(n,a)+pi_k(p_a)-1 ]

    故只需要分别计算(pi_k(p_a))(P_{2,k}(n,a))(phi_k(n,a))即可。

    对于(pi_k(p_a))。线性筛即可。时间复杂度(O(B))

    对于(P_{2,k}(n,a))。根据定义有

    [P_{2,k}(n,a)=sum_{substack{p_a< pleq q\ pqleq n}}(pq)^k ]

    注意到(B< pleq q< leftlfloorfrac{n}{B} ight floor),于是线性筛预处理,然后枚举(p)计算所有可行的(q)的贡献,为

    [P_{2,k}(n,a)=sum_{p_a< pleq sqrt{n}}p^kleft(pi_kleft(leftlfloorfrac{n}{p} ight floor ight)-pi_k(p-1) ight) ]

    时间复杂度(O(frac{n}{B}))

    对于(phi_k(n,a))。根据容斥,容易得到递推式

    [phi_k(n,a)=phi_k(n,a-1)-p_a^kphileft(leftlfloorfrac{n}{p_a} ight floor,a-1 ight) ]

    边界条件为

    [phi_k(n,0)=S_k(n) ]

    考虑DFS计算该式。

    若每次都递推到边界,有

    [phi_k(n,a)=sum_{gamma(x)leq p_a}mu(x)x^kS_kleft(leftlfloorfrac{n}{x} ight floor ight) ]

    复杂度难以接受,考虑剪枝。

    加入(x> B)时停止递归的剪枝,有

    [phi_k(n,a)=sum_{xleq B}mu(n)x^kS_kleft(leftlfloorfrac{n}{x} ight floor ight)+sum_{frac{x}{delta(x)}leq B< x}mu(x)x^kphi_kleft(leftlfloorfrac{n}{x} ight floor,pi(delta(x))-1 ight) ]

    [mathcal{S_0}=sum_{xleq B}mu(n)x^kS_kleft(leftlfloorfrac{n}{x} ight floor ight) ]

    [mathcal{S}=sum_{frac{x}{delta(x)}leq B< x}mu(x)x^kphi_kleft(leftlfloorfrac{n}{x} ight floor,pi(delta(x))-1 ight) ]

    那么

    [phi_k(n,a)=mathcal{S_0}+mathcal{S} ]

    对于(mathcal{S_0}),线性筛预处理后(O(B))计算即可。

    对于

    [mathcal{S}=-sum_{pleq B}sum_{substack{delta(x)> p\ xleq B< xp}}mu(x)p^kx^kphi_kleft(leftlfloorfrac{n}{xp} ight floor,pi(p)-1 ight) ]

    分块计算。

    [mathcal{S_1}=-sum_{n^frac{1}{3}< pleq B}sum_{substack{delta(x)> p\ xleq B< xp}}mu(x)p^kx^kphi_kleft(leftlfloorfrac{n}{xp} ight floor,pi(p)-1 ight) ]

    [mathcal{S_2}=-sum_{n^frac{1}{4}< pleq n^frac{1}{3}}sum_{substack{delta(x)> p\ xleq B< xp}}mu(x)p^kx^kphi_kleft(leftlfloorfrac{n}{xp} ight floor,pi(p)-1 ight) ]

    [mathcal{S_3}=-sum_{pleq n^frac{1}{4}}sum_{substack{delta(x)> p\ xleq B< xp}}mu(x)p^kx^kphi_kleft(leftlfloorfrac{n}{xp} ight floor,pi(p)-1 ight) ]

    那么

    [mathcal{S}=mathcal{S_1}+mathcal{S_2}+mathcal{S_3} ]

    对于(mathcal{S_1},mathcal{S_2}),注意到(delta(x)> p> n^frac{1}{4})(xleq Bleq n^frac{1}{2})。于是(x)只能为质数。

    于是

    [mathcal{S_1}=sum_{n^frac{1}{3}< pleq B}sum_{p< qleq B}p^kq^kphi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight) ]

    [mathcal{S_2}=sum_{n^frac{1}{4}< pleq n^frac{1}{3}}sum_{p< qleq B}p^kq^kphi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight) ]

    对于(mathcal{S_1})。由于(leftlfloorfrac{n}{pq} ight floor< n^frac{1}{3}< p),所以(phi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight)=1)

    于是

    [mathcal{S_1}=sum_{n^frac{1}{3}< pleq B}sum_{p< qleq B}p^kq^k=sum_{n^frac{1}{3}< pleq B}p^k(pi_k(B)-pi_k(p)) ]

    时间复杂度(O(B))

    对于(mathcal{S_2}),考虑分成两个部分计算。令

    [mathcal{U}=sum_{n^frac{1}{4}< pleq n^frac{1}{3}}sum_{substack{p< qleq B\ q> frac{n}{p^2}}}p^kq^kphi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight) ]

    [mathcal{V}=sum_{n^frac{1}{4}< pleq n^frac{1}{3}}sum_{substack{p< qleq B\ qleq frac{n}{p^2}}}p^kq^kphi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight) ]

    那么(mathcal{S_2}=mathcal{U}+mathcal{V})

    对于(mathcal{U}),因为(q> frac{n}{p^2}),所以有(p> sqrt{frac{n}{q}}geq sqrt{frac{n}{B}})。同时,由于(leftlfloorfrac{n}{pq} ight floor<p),所以(phi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight)=1)

    于是

    [mathcal{U}=sum_{sqrt{frac{n}{B}}< pleq n^frac{1}{3}}sum_{substack{p< qleq B\ q> frac{n}{p^2}}}p^kq^k=sum_{sqrt{frac{n}{B}}< pleq n^frac{1}{3}}p^kleft(pi_k(B)-pi_kleft(minleft{p,leftlfloorfrac{n}{p^2} ight floor ight} ight) ight) ]

    时间复杂度(O(B))

    对于(mathcal{V}),我们有(pleq frac{n}{pq}< sqrt{n}< p^2),所以(phi_kleft(leftlfloorfrac{n}{pq} ight floor,pi(p)-1 ight)=1+pi_kleft(leftlfloorfrac{n}{pq} ight floor ight)-pi_k(p)+p^k)

    于是把(mathcal{V})分成两个部分计算。令

    [mathcal{V_1}=sum_{n^frac{1}{4}< pleq n^frac{1}{3}}p^k(1-pi_k(p)+p^k)sum_{substack{p< qleq B\ qleq frac{n}{p^2}}}q^k ]

    [mathcal{V_2}=sum_{n^frac{1}{4}< pleq n^frac{1}{3}}p^ksum_{substack{p< qleq B\ qleq frac{n}{p^2}}}q^kpi_kleft(leftlfloorfrac{n}{pq} ight floor ight) ]

    那么(mathcal{V}=mathcal{V_1}+mathcal{V_2})

    对于(mathcal{V_1}),直接枚举(p)计算即可。

    对于(mathcal{V_2}),用类似数论分块的方法计算。枚举(p),对于所有(pi_kleft(leftlfloorfrac{n}{pq} ight floor ight))相同的(q)一起统计贡献,可以证明最多只有(pileft(leftlfloorfrac{n}{p^2} ight floor ight)),个状态。于是时间复杂度为(Oleft(frac{n^frac{2}{3}}{log n} ight))

    对于(mathcal{S_3}),枚举(p),用树状数组统计其对所有有用的(phi_k)的贡献。时间复杂度为(Oleft(frac{n}{B}log n ight))

    时间复杂度

    (B=O(n^frac{1}{3}log^2 n))时总复杂度达到最优,为(Oleft(frac{n^frac{2}{3}}{log n} ight))

    (将(mathcal{V_2})分成5个部分计算可进一步将时间复杂度优化至(Oleft(frac{n^frac{2}{3}}{log^2 n} ight)),在此不过多叙述)。

    (实际上由于常数原因,在(nleq 10^{11})范围内跑得不如(Oleft(frac{n^frac{3}{4}}{log n} ight))的递推做法或(O(n^frac{2}{3}))的树状数组优化做法快)。

    代码咕咕咕

    参考文献:

  • 相关阅读:
    ViewGroup和View
    十二、Android UI开发专题(转)
    十一、Android学习笔记_AsyncQueryHandler的应用
    十、Notepad++正则表达式使用
    九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出
    八、android jni 之C语言基础
    七、Android学习笔记_JNI hello world
    六、Android学习笔记_JNI_c调用java代码
    五、PackageManager获取版本号
    四、 Android之手机屏幕朝向
  • 原文地址:https://www.cnblogs.com/Y25t/p/13547026.html
Copyright © 2011-2022 走看看