文章目录

  • 杜教筛
  • 方法
  • 举例
    • 莫比乌斯函数
    • 欧拉函数
  • 时间复杂度

杜教筛

杜教筛用于求一类积性函数的前缀和,时间复杂度可以做到 O(n23)O(n^{\frac{2}{3}})O(n32​)。

方法

设我们要求的是积性函数函数 f(x)f(x)f(x) 的前缀和 S(n)=∑i=1nf(i)S(n) = \sum_{i = 1}^n f(i)S(n)=∑i=1n​f(i)。
我们取一个积性函数 ggg(ggg 具体是什么由 fff 决定,但这不影响推式子)则 ∑i=1n(f∗g)(i)=∑i=1n∑d∣ig(d)f(id)=∑d=1ng(d)∑d∣if(id)=∑d=1ng(d)∑j=1⌊nd⌋f(j)=∑d=1ng(d)S(⌊nd⌋)\begin{aligned}\sum_{i = 1}^n (f*g)(i) = &\sum_{i = 1}^n\sum_{d | i} g(d)f\left(\frac{i}{d}\right) \\ = &\sum_{d = 1}^n g(d)\sum_{d | i}f\left(\frac{i}{d}\right) \\ =&\sum_{d = 1}^n g(d)\sum_{j = 1}^{\left\lfloor\frac{n}{d}\right\rfloor}f(j) \\ =&\sum_{d = 1}^n g(d) S\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\end{aligned}i=1∑n​(f∗g)(i)====​i=1∑n​d∣i∑​g(d)f(di​)d=1∑n​g(d)d∣i∑​f(di​)d=1∑n​g(d)j=1∑⌊dn​⌋​f(j)d=1∑n​g(d)S(⌊dn​⌋)​ 要求 S(n)S(n)S(n),所以尝试计算 g(1)S(n)=∑d=1ng(d)S(⌊nd⌋)−∑d=2ng(d)S(⌊nd⌋)=∑i=1n(f∗g)(i)−∑d=2ng(d)S(⌊nd⌋)\begin{aligned} g(1)S(n) = &\sum_{d = 1}^n g(d) S\left(\left\lfloor\frac{n}{d}\right\rfloor\right) - \sum_{d = 2}^n g(d) S\left(\left\lfloor\frac{n}{d}\right\rfloor\right) \\ =& \sum_{i = 1}^n (f*g)(i) - \sum_{d = 2}^n g(d) S\left(\left\lfloor\frac{n}{d}\right\rfloor\right) \end{aligned}g(1)S(n)==​d=1∑n​g(d)S(⌊dn​⌋)−d=2∑n​g(d)S(⌊dn​⌋)i=1∑n​(f∗g)(i)−d=2∑n​g(d)S(⌊dn​⌋)​ 也就是说如果 (f∗g)(f*g)(f∗g) 和 ggg 的前缀和都能很快地算,后面那个数论分块,我们就可以得到 S(n)S(n)S(n) 了!

举例

莫比乌斯函数

f=μf = \muf=μ,注意到 μ∗1=ε\mu*1 = \varepsilonμ∗1=ε,1(x)=11(x) = 11(x)=1 和 ε(x)=[x=1]\varepsilon(x) = [x = 1]ε(x)=[x=1] 的前缀和都很显然,于是取 g=1g = 1g=1 即可。

欧拉函数

f=φf = \varphif=φ,注意到 φ∗1=i\varphi * 1 = iφ∗1=i,1(x)=11(x) = 11(x)=1 和 i(x)=xi(x) = xi(x)=x 的前缀和都很显然,于是取 g=1g = 1g=1 即可。

时间复杂度

只考虑 ggg 和 f∗gf * gf∗g 的前缀和能够 O(1)O(1)O(1) 计算的情况。设 T(n)T(n)T(n) 为计算 S(n)S(n)S(n) 的时间复杂度(大 OOO 记号),有 T(n)=O(n)+∑i=2n(T(i)+T(ni))=O(n)+∑i=2n(O(i)+∑j=2iT(j)+O(ni)+∑j=2niT(j))\begin{aligned}T(n) = &O\left(\sqrt n\right) + \sum_{i = 2}^{\sqrt n} \left(T(i) + T\left(\frac{n}{i}\right)\right) \\= &O\left(\sqrt n\right) + \sum_{i = 2}^{\sqrt n}\left(O\left(\sqrt i\right) + \sum_{j = 2}^{\sqrt i} T(j) +O\left(\sqrt{\frac{n}{i}}\right) + \sum_{j = 2}^{\sqrt {\frac{n}{i}}} T(j)\right)\end{aligned}T(n)==​O(n​)+i=2∑n​​(T(i)+T(in​))O(n​)+i=2∑n​​⎝⎜⎛​O(i​)+j=2∑i​​T(j)+O(in​​)+j=2∑in​​​T(j)⎠⎟⎞​​ 其中 O(n)O\left(\sqrt n\right)O(n​) 是该层合并复杂度。

通常用的大 OOO 记号是渐进时间复杂度,可以理解为 n→∞n\to \inftyn→∞ 的时间消耗,也可以作为最坏时间复杂度理解,因此通常用的大 OOO 记号的定义是:假设程序进行常数运算的次数为 ϕ(n)\phi(n)ϕ(n),存在一个函数 τ(n)\tau(n)τ(n) 使得 lim⁡n→∞ϕ(n)τ(n)=C\lim\limits_{n\to \infty}\frac{\phi(n)}{\tau(n)} = Cn→∞lim​τ(n)ϕ(n)​=C,其中 CCC 是一个 非零 常数,那么该程序时间复杂度为 O(τ(n))O(\tau(n))O(τ(n))。在数学上称 ϕ(n)\phi(n)ϕ(n) 和 τ(n)\tau(n)τ(n) 是同阶的。

因此从定义可以看出,大 OOO 记号是忽略了高阶无穷小的,只保留同阶无穷。

如果 lim⁡x→∞α(x)β(x)=0\lim\limits_{x \to \infty}\frac{\alpha(x)}{\beta(x)} = 0x→∞lim​β(x)α(x)​=0,则称 β(x)\beta(x)β(x) 比 α(x)\alpha(x)α(x) 低阶无穷小;
如果 lim⁡x→∞α(x)β(x)=C≠0\lim\limits_{x \to \infty}\frac{\alpha(x)}{\beta(x)} = C \neq 0x→∞lim​β(x)α(x)​=C​=0,CCC 是常数,则称 β(x)\beta(x)β(x) 是 α(x)\alpha(x)α(x) 的同阶无穷小;
如果 lim⁡x→∞α(x)β(x)=∞\lim\limits_{x \to \infty}\frac{\alpha(x)}{\beta(x)} = \inftyx→∞lim​β(x)α(x)​=∞,则称 β(x)\beta(x)β(x) 比 α(x)\alpha(x)α(x) 高阶无穷小。

由于 lim⁡n→∞n12n14=lim⁡n→∞n14=∞\lim\limits_{n \to \infty}\frac{n^{\frac{1}{2}}}{n^{\frac{1}{4}}} = \lim\limits_{n \to \infty} n^\frac{1}{4} = \inftyn→∞lim​n41​n21​​=n→∞lim​n41​=∞,所以 n\sqrt{\sqrt n}n​​ 相对 n\sqrt nn​ 是高阶无穷小量,对于大 OOO 记号可以忽略,所以 T(n)=O(n)+∑i=2n(O(i)+O(ni))\begin{aligned}T(n) = &O\left(\sqrt n\right) + \sum_{i = 2}^{\sqrt n}\left(O\left(\sqrt i\right) + O\left(\sqrt{\frac{n}{i}}\right) \right)\end{aligned}T(n)=​O(n​)+i=2∑n​​(O(i​)+O(in​​))​ (粗略估计)由均值不等式 i+ni≥2ini=2n14\sqrt i + \sqrt{\frac{n}{i}} \geq 2\sqrt{\sqrt{i\frac{n}{i}}} = 2n^{\frac{1}{4}}i​+in​​≥2iin​​​=2n41​,于是 ∑i=2n(O(i)+O(ni))≥n12n14=n34\sum\limits_{i = 2}^{\sqrt n}\left(O\left(\sqrt i\right) + O\left(\sqrt{\frac{n}{i}}\right) \right) \geq n^{\frac{1}{2}} n^{\frac{1}{4}} = n^{\frac{3}{4}}i=2∑n​​(O(i​)+O(in​​))≥n21​n41​=n43​,于是 T(n)=O(n34)T(n) = O\left(n^{\frac{3}{4}}\right)T(n)=O(n43​)。

但是我们可以先线性筛预处理出一部分前缀和,这样某些前缀和就能之间查询了。假设我们预处理了前 mmm 个前缀和,那么复杂度变为 T(n)=O(m)+O(n)+∑i=2n([i>m]O(i)+[ni>m]O(ni))\begin{aligned} T(n) =&O(m) + O\left(\sqrt n\right) + \sum_{i = 2}^{\sqrt n}\left(\left[\sqrt i > m\right]O\left(\sqrt i\right) + \left[\sqrt{\frac{n}{i}} > m\right]O\left(\sqrt{\frac{n}{i}}\right) \right)\end{aligned}T(n)=​O(m)+O(n​)+i=2∑n​​([i​>m]O(i​)+[in​​>m]O(in​​))​ 让 m≥n14m \geq n^{\frac{1}{4}}m≥n41​(在一定限度内 mmm 肯定越大越好),那么 T(n)=O(m)+O(n)+∑i=2n[ni>m]O(ni)=O(m)+O(n)+∑i=2nm2O(ni)≥O(m)+O(n)+O(nnm2)\begin{aligned} T(n) =&O(m) + O\left(\sqrt n\right) + \sum_{i = 2}^{\sqrt n}\left[\sqrt{\frac{n}{i}} > m\right]O\left(\sqrt{\frac{n}{i}}\right) \\ =&O(m) + O\left(\sqrt n \right) + \sum_{i = 2}^{\frac{n}{m^2}} O\left(\sqrt{\frac{n}{i}}\right)\\ \geq &O(m) + O\left(\sqrt n\right) + O\left(\frac{n\sqrt n}{m^2}\right)\end{aligned}T(n)==≥​O(m)+O(n​)+i=2∑n​​[in​​>m]O(in​​)O(m)+O(n​)+i=2∑m2n​​O(in​​)O(m)+O(n​)+O(m2nn​​)​ 当 m=n23m = n^{\frac{2}{3}}m=n32​ 时能取到最优复杂度 O(n23)O(n^{\frac{2}{3}})O(n32​)。

因此杜教筛的时间复杂度为 O(n23)O(n^\frac{2}{3})O(n32​)。

杜教筛及其时间复杂度分析相关推荐

  1. 杜教筛【莫比乌斯前缀和,欧拉函数前缀和】推导与模板【一千五百字】

    下图给出杜教筛详细推导过程,前置知识有积性函数和莫比乌斯反演. 杜教筛是一种优秀的求积性函数前缀和算法,其时间复杂度受预处理数组的影响,一般开到2/3次幂大小,可使复杂度达到较为优秀的程度. 杜教筛的 ...

  2. 杜教筛 (包括线筛) 莫比乌斯函数前缀和 欧拉函数前缀和 因数和函数前缀和 因子个数前缀和 ( 分析 )...

    对于莫比乌斯函数 和 欧拉函数  小于 1e8差不多都可线筛    1e12以内  杜教筛 代码针对洛古  p4213  n<=(1<<31)-1  杜教筛 #include< ...

  3. 2018 ICPC 徐州网络赛 D. Easy Math(思维,反演,杜教筛)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/A2003 Problem 计算 ...

  4. Luogu P6055 [RC-02] GCD(莫比乌斯反演,杜教筛)(这题乐死我了,真就图一乐呗)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P6055 Prob ...

  5. 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

    题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N" ...

  6. 【bzoj4916】神犇和蒟蒻 杜教筛

    题目描述 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出 请你输出一个整数A=\sum_{ ...

  7. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】

    参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...

  8. 模板:杜教筛(莫比乌斯反演、数论)

    所谓杜教筛,就是dms教给我们的筛 (逃) 前言 与其说算法,不如说是技巧. 可以在低于线性的时间复杂度(准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​))内完成对积性函数的 ...

  9. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】

    除了最后一题都比较简单就写一起了 P4450-双亲数 题目链接:https://www.luogu.com.cn/problem/P4450 题目大意 给出A,B,dA,B,dA,B,d求有多少对(a ...

最新文章

  1. windows下cmd命令行显示UTF8字符设置
  2. CentOS6.8 安装/升级Python2.7.x,并安装最新setuptools、pip、fabric程序总结
  3. 字符串的指针和指向字符串的指针变量
  4. 本田da屏怎么进wince系统_东风本田LIFE“来福酱”上市
  5. winsows10下用ninja编译配置caffe
  6. android闹钟唤醒不准的原因_俄罗斯睡眠专家:闹钟铃声选错了,可能扰乱你的内分泌...
  7. Actor-ES框架:消息发布器与消息存储器
  8. js判断时间是早上还是下午_牛奶早上喝好,还是晚上喝好?没想到“最佳时间”是这个点,颠覆了!...
  9. 划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道
  10. jquery加载完成后方法只执行一次_JavaScript的超级库--jQuery内容整理(3)
  11. 拓扑排序:Kahn算法
  12. python排课问题_教育机构如何解决排课问题?
  13. Java笔记(14):常用对象--正则表达式、GC
  14. Spring Boot 开发微信公众号后台
  15. window10笔记本插上耳机音量只能35
  16. Elsa-审批流实现
  17. 先有史记还是先有资治通鉴?司马迁、司马光和司马懿三人什么关系?
  18. 检测PE文件加壳信息用的特征码
  19. hx1838 红外遥控(1):接收时序的解码
  20. 高德地图 坐标与地址

热门文章

  1. OpenPose生成Maya人物动作
  2. javapython学习教程_Java入门教程
  3. 墨者学院-WEB页面分析
  4. 游戏蓝牙耳机哪个好用?2022超低延迟游戏蓝牙耳机推荐
  5. GVARUSL---拉萨假日构图
  6. S5P4418 android 5.1 EC20 R2.0 PCIE接口调试记录
  7. 回收站清空数据恢复的方法
  8. Inotify与Android文件监控FileObserver原理
  9. 【mean teacher】IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python o的解决
  10. Mysql常用sql语句(11)- between and 范围查询