zoukankan      html  css  js  c++  java
  • 杜教筛

    前言

    杜教筛是杜瑜皓引入国内的一种非线性复杂度内求积性函数前缀和的算法。
    对于前 (n^{2/3}) 的范围线性筛,其余进行递归处理。
    时间复杂度 (O(n^{2/3}))

    前置知识

    • 狄利克雷卷积
    • 常见的积性函数

    实现

    假设我们要求 (sum(n)=sumlimits_{i=1}^{n} f(i)) ,不妨构造 (g) 使得 (h=f*g)

    [sumlimits_{i=1}^{n}h(i)=sumlimits_{i=1}^{n} sumlimits_{j|i} g(j)f(frac{i}{j}) ]

    [=sumlimits_{j=1}^{n} g(j)sumlimits_{i=1}^{lfloor frac{n}{j} floor} f(i) ]

    [=sumlimits_{j=1}^{n} g(j) sum(lfloor frac{n}{j} floor) ]

    因此

    [g(1)sum(n)=sumlimits_{i=1}^{n} h(i) - sumlimits_{j=2}^{n} g(j)sum(lfloor frac{n}{j} floor) ]

    直接整除分块,递归处理即可。
    注意这里的 (h)(g) 要尽可能构造的简单,以方便计算。

    复杂度证明

    (S(n)) 的算法复杂度为 (T(n)) ,则有

    [T(n)=O(sqrt{n})+sumlimits_{i=2}^{sqrt{n}} (T(i)+T(frac{n}{i})) ]

    往下迭代一层,注意到再往下就是高阶小量,所以可忽略不计。

    [T(n)=O(sqrt{n})+sumlimits_{i=2}^{sqrt{n}} (O(sqrt{i})+O(sqrt{frac{n}{i}}) ]

    [= O(sqrt{n}) + sumlimits_{i=2}^{sqrt{n}} O(sqrt{sqrt{n}}) ]

    [= O(n^{1/2}) + O(n^{3/4}) ]

    [= O(n^{3/4}) ]

    考虑预处理前 (k) 项的前缀和,则

    [T(n)=sumlimits_{i=2}^{frac{n}{k}} O(sqrt{frac{n}{i}}) ]

    [=O(frac{n}{k} sqrt{k})=O(frac{n}{sqrt{k}}) ]

    平衡一下预处理和计算函数,则 (frac{n}{sqrt{k}} = k) ,即 (k^{frac{3}{2}}=n)
    (k=n^{frac{2}{3}}) ,此时预处理降至 (O(n^{frac{2}{3}})) ,计算函数降至 (O(n^{frac{2}{3}}))
    因此总时间复杂度 (O(n^{frac{2}{3}}))

    examples

    • (sumlimits_{i=1}^{n} varphi(n))
      (g=I) ,则有 (h=varphi * I = id) ,因此

    [sum(n)=frac{n(n+1)}{2}-sumlimits_{j=2}^{n} sum(lfloor frac{n}{j} floor) ]

    • (sumlimits_{i=1}^{n} mu(n))
      (g=I) ,则有 (h=mu * I = ϵ) ,因此

    [sum(n)=1-sumlimits_{j=2}^{n} sum(lfloor frac{n}{j} floor) ]

    • (sumlimits_{i=1}^{n} n imes varphi(n))
      (g=ID) ,则有 (h=(ID imes varphi)*ID = ID^2) ,因此

    [sum(n)=frac{n(n+1)(2n+1)}{6} -sumlimits_{j=2}^{n} sum(lfloor frac{n}{j} floor) ]

    四个小结论

    (mu(n)=0) 时,下列四个柿子都等于 (0) ,否则结果如下

    (sum_{d|n}dmu(d)varphi(frac{n}{d})=mu(n))

    (sum_{d|n}frac{n}{d}mu(d)varphi(d)=1)

    (sum_{d|n}frac{dmu(frac{n}{d})}{varphi(d)}=frac{1}{varphi(n)})

    (sum_{d|n}frac{varphi(d)mu(frac{n}{d})}{d}=frac{mu(n)}{n})

    读者自证不难

  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/wlzhouzhuan/p/13456260.html
Copyright © 2011-2022 走看看