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})

    读者自证不难

  • 相关阅读:
    ASP.NET MVC 3.0(八): MVC 3.0 传递和保存你的Model
    ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页
    ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件
    ASP.NET MVC 3.0(十七): MVC 3.0 实例之表格中数据的筛选
    ASP.NET MVC 3.0 学习系列
    ASP.NET MVC 3.0(五): 入手Controller/Action
    ASP.NET MVC 3.0(十五): MVC 3.0 实例系列之表格的排序
    ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
    ASP.NET MVC 3.0(九): MVC 3.0 验证你的Model
    设计功能与界面的测试
  • 原文地址:https://www.cnblogs.com/wlzhouzhuan/p/13456260.html
Copyright © 2011-2022 走看看