zoukankan      html  css  js  c++  java
  • 积性函数求和:构造狄利克雷卷积将值域限定于powerful number

    前情提要:$O(n^{0.75}/log n)$ 时间的积性函数求和。当 $n ge 10^{12}$ 的时候需要十几秒出解。

    如果积性函数的性质更好,那么我们可以更快地求和。

    假设积性函数 $f$ 和易于求和的积性函数 $g$ 满足 $f(p)=g(p)$,且 $f=g*h$, $g*h$ 表示 $g, h$ 的狄利克雷卷积,也就是 $f(n)=sum_{d|n}g(d)hleft({n over d} ight)$.

    那么我们函数 $h$ 可能比较难看,但是它具有性质:$h(p)=0$. 这意味着,凡是满足 $h(n) e 0$ 的数都是powerful number, 换句话说它的每个素因子次数都不小于 $2$.

    Powerful number 可以写成 $a^2b^3$ 的形式。

    $sum_{b=1}^{sqrt[3]n}sqrt{n over b^3}=Oleft(sqrt nint_{1}^{sqrt[3]n}t^{-1.5}mathrm dt ight)=O(sqrt n)$

    所以 powerful number 的个数是 $O(sqrt n)$.

    设 $G$ 是 $g$ 的前缀和。现在我们有:

    $$sum_{i=1}^nf(i)=sum_{i=1}^nsum_{j|i}gleft({i over j} ight)h(j)=sum_{[j le n, j ext{ is powerful}]}^nh(j)Gleft({n over j} ight)$$

    于是如果我们已经对于所有 powerful number $i$ 求出 $gleft({n over i} ight)$, 则后续的积性函数求和步骤将在 $O(sqrt n)$ 时间内完成。

    当然 $g$ 的求和可能会比较难做。一些特殊的数论函数可能可以杜教筛求和。比较有意思的是这么一个例子:

    题目来源:钟子谦。这是他的 powerful number 求和法博客链接

    设积性函数 $f$ 满足 $f(p^c)=2^c$, 求 $sum_{i=1}^N f(i)$, $N le 10^{12}$.

    注意到 $f(p)=2$, 设 $g(n)$ 表示 $n$ 的约数个数,$g(p)=2=f(p)$. 再构造 $h(p^c)=2^{c-2}(c ge 2)$, 得 $f=g*h$.

    由于 $G(n)=sum_{i=1}^nsum_{j|i}1=sum_{ij le n}1=2sum_{i=1}^{lfloorsqrt n floor}leftlfloor{n over i} ight floor-(lfloorsqrt n floor)^2$, 可在 $O(sqrt n)$ 时间内求 $G(n)$.

    所以对于所有 $k={n over a^2b^3}$ 求 $G(k)$, 时间复杂度为 $Oleft(sum_{a, b}sqrt{n over a^2b^3} ight)=Oleft(sum_{a}sqrt{n over a^2} ight)=O(sqrt nlog n)$.

  • 相关阅读:
    【原创】QTP中手动添加对象
    【转载】【缺陷预防技术】流程技术预防
    【资料】HP Loadrunner 11下载地址
    使用命令行操作VSS
    sql server 按时间段查询记录的注意事项
    Asp.net应用程序文件名重名引起的bug
    使用SQL语句查询表中重复记录并删除
    backgroundpositionx的兼容性问题
    关于Asp.net Development Server
    如何查看正在使用某个端口的应该程序
  • 原文地址:https://www.cnblogs.com/nealchen/p/Powerful-Number.html
Copyright © 2011-2022 走看看