所谓杜教筛,就是dms教给我们的筛

(逃)

前言

与其说算法,不如说是技巧。
可以在低于线性的时间复杂度(准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​))内完成对积性函数的前缀和计算。

解析

考虑求函数 fff 的前缀和:
S(n)=∑i=1nf(i)S(n)=\sum_{i=1}^nf(i)S(n)=i=1∑n​f(i)
寻找另一个函数 ggg,设 h=f∗gh=f*gh=f∗g,那么有:
∑i=1nh(i)=∑i=1n∑d∣ig(d)f(id)=∑d=1ng(d)∑i=1⌊nd⌋f(i)=∑d=1ng(d)S(⌊nd⌋)\sum_{i=1}^nh(i)=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac i d)\\=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac n d\rfloor}f(i)\\=\sum_{d=1}^ng(d)S(\lfloor\dfrac n d\rfloor)i=1∑n​h(i)=i=1∑n​d∣i∑​g(d)f(di​)=d=1∑n​g(d)i=1∑⌊dn​⌋​f(i)=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⌋)=∑d=1nh(d)−∑d=2ng(d)S(⌊nd⌋)g(1)S(n)=\sum_{d=1}^ng(d)S(\lfloor\dfrac n d\rfloor)-\sum_{d=2}^ng(d)S(\lfloor\dfrac n d\rfloor)\\=\sum_{d=1}^nh(d)-\sum_{d=2}^ng(d)S(\lfloor\dfrac n d\rfloor)g(1)S(n)=d=1∑n​g(d)S(⌊dn​⌋)−d=2∑n​g(d)S(⌊dn​⌋)=d=1∑n​h(d)−d=2∑n​g(d)S(⌊dn​⌋)
后面的 SSS 就可以递归求解了。

时间复杂度

按照上面的式子,可以写出时间复杂度的递推式:
T(n)=O(n)+∑i=2n(T(i)+T(ni))T(n)=O(\sqrt n)+\sum_{i=2}^{\sqrt n}(T(i)+T(\frac n i))T(n)=O(n​)+i=2∑n​​(T(i)+T(in​))
由于再往下递归就是高阶小量,我们只需要展开一层:
T(n)=O(n)+∑i=2n(O(i)+O(ni))T(n)=O(\sqrt n)+\sum_{i=2}^{\sqrt n}(O(\sqrt i)+O(\sqrt \frac n i))T(n)=O(n​)+i=2∑n​​(O(i​)+O(in​​))
由于 O(i)+O(ni)≥O(2n)=O(n14)O(\sqrt i)+O(\sqrt \frac n i)\ge O(2\sqrt{\sqrt n})=O(n^{\frac 1 4})O(i​)+O(in​​)≥O(2n​​)=O(n41​),所以总的复杂度大概是 O(n34)O(n^{\frac 3 4})O(n43​)。

考虑先用线性筛预处理出一部分前缀和。
由于算法本身根号分治就有 O(n)O(\sqrt n)O(n​),所以不妨设预处理的范围 m>nm>\sqrt nm>n​。
那么时间复杂度就变成了:
T(n)=O(m)+O(n)+∑i=2⌊nm⌋T(⌊ni⌋)=O(m)+O(n)+∑i=2⌊nm⌋O(⌊ni⌋)=O(m)+O(n)+∫0nmnx=O(m)+O(n)+f(nm)(f(x)=nx)=O(m)+O(n)+O(nm)≥O(n23)T(n)=O(m)+O(\sqrt n)+\sum_{i=2}^{\lfloor\frac n m\rfloor}T(\lfloor\frac n i\rfloor)\\=O(m)+O(\sqrt n)+\sum_{i=2}^{\lfloor\frac n m\rfloor}O(\sqrt{\lfloor\frac n i\rfloor})\\=O(m)+O(\sqrt n)+\int_0^{\frac n m}\sqrt{\frac n x}\\=O(m)+O(\sqrt n)+f(\frac n m)(f(x)=\sqrt{nx})\\=O(m)+O(\sqrt n)+O(\frac{n}{\sqrt m})\\\ge O(n^{\frac 2 3})T(n)=O(m)+O(n​)+i=2∑⌊mn​⌋​T(⌊in​⌋)=O(m)+O(n​)+i=2∑⌊mn​⌋​O(⌊in​⌋​)=O(m)+O(n​)+∫0mn​​xn​​=O(m)+O(n​)+f(mn​)(f(x)=nx​)=O(m)+O(n​)+O(m​n​)≥O(n32​)
当 m=n23m=n^\frac 2 3m=n32​ 时取等。

应用

如何使用杜教筛呢?

举个例子:计算 ∑i=1nμ(i)\sum_{i=1}^n\mu(i)∑i=1n​μ(i)。
我们把刚才的核心式子拿下来:

g(1)S(n)=∑d=1nh(d)−∑d=2ng(d)S(⌊nd⌋)g(1)S(n)=\sum_{d=1}^nh(d)-\sum_{d=2}^ng(d)S(\lfloor\dfrac n d\rfloor)g(1)S(n)=d=1∑n​h(d)−d=2∑n​g(d)S(⌊dn​⌋)
首先,我们需要使 ∑d=1nh(d)\sum_{d=1}^nh(d)∑d=1n​h(d) 可以很容易的求出来,不然就没有意义了。
同时,我们最好也能让 ggg 函数简单一些。
想到:μ∗1=e\mu*1=eμ∗1=e。
令 g=1,h=eg=1,h=eg=1,h=e,就很好的满足了我们的要求。
式子变成:
S(n)=1−∑d=2nS(⌊nd⌋)S(n)=1-\sum_{d=2}^nS(\lfloor\dfrac n d\rfloor)S(n)=1−d=2∑n​S(⌊dn​⌋)
非常简洁,直接求解即可。
实现上,需要开一个 map 或者哈希表进行记忆化。

代码

ll getmu(int n){if(n<=w) return sum1[n];if(mp1.count(n)) return mp1[n];ll ans=1;for(ll l=2,r;l<=n;l=r+1){assert(n/l);r=n/(n/l);ans-=(r-l+1)*getmu(n/l);}return mp1[n]=ans;
}

模板:杜教筛(莫比乌斯反演、数论)相关推荐

  1. P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]

    简单的数学题 题目连接 https://www.luogu.org/problemnew/show/P3768 题目描述 输入一个正整数n,n≤1010n,n\le 10^{10}n,n≤1010和p ...

  2. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)

    G.(2019 ACM/ICPC 全国邀请赛(西安)B) Product Weblink https://nanti.jisuanke.com/t/39269 Problem && S ...

  3. matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...

    数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...

  4. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛

    F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...

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

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

  6. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  7. 数论函数 - 莫比乌斯函数与莫比乌斯反演 - 基础杜教筛

    原文链接http://www.cnblogs.com/zhouzhendong/p/8627380.html 省选后发现我数学好差.于是先从数论开始学习. 如果发现本文有任何错误,欢迎留言指正. 本文 ...

  8. 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛

    Powered by:NEFU AB-IN 文章目录 欧拉函数 狄利克雷卷积 莫比乌斯函数 莫比乌斯反演 P3455 [POI2007]ZAP-Queries 整除分块 P2522 [HAOI2011 ...

  9. 牛客P19836 裴蜀定理+莫比乌斯反演+杜教筛

    题意: 一开始一个人在原点,它拥有 n n n个整数 x i x_{i} xi​,并且 x i ∈ [ 1 , m ] x_{i}\in[1,m] xi​∈[1,m],他每次可以选择一个 x i x_ ...

最新文章

  1. 解题报告:luogu P3469 [POI2008]BLO-Blockade(割点判定 + 思维计算)
  2. codeforces685B
  3. Python文件操作IO open 读-取-写
  4. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?
  5. Unity 安卓连调profile失败
  6. access集团和abm_ACCESS集团宣布启动“ABM单创66会员狂欢节”
  7. zabbix编译安装
  8. DevPartner Studio Professional Edition 11 内存泄露检测使用
  9. 一台机器起多个filebeat_机器人开发 | TechX 2020
  10. JQuery左右切换实现
  11. hadoop环境搭建总结
  12. 步骤安装Ubuntu 11.04用五笔
  13. 力扣算法题用c语言实现,刷题-力扣-25
  14. 分别用Java应用程序和Applet程序实现星星三角形图案的绘制
  15. 真我q2PRO鸿蒙系统,看看搭载鸿蒙OS2.0系统的华为MatePad Pro 2跑分如何?
  16. python混淆矩阵,详解使用python绘制混淆矩阵(confusion_matrix)
  17. 怎么在GIF动图中添加文字?一个方法教你快速完成GIF加字
  18. css-filter属性-融合效果-1.1
  19. 一张图看懂cell, pin, net, port
  20. 解决猫眼自定义字体的问题-获取影院实时电影拍片或实时票房等

热门文章

  1. 程序员面试必备的20条Python经典面试题
  2. java号段_JAVA手机号正则(多号段)
  3. mysql批量条件字段_mysql批量更新多条记录的同一个字段为不同值的方法
  4. okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
  5. ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
  6. librosa能量_语音MFCC提取:librosa amp;amp; python_speech_feature(2019.12)
  7. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些
  8. java中的console是干什么的_[Java教程]javascript中,你真的会用console吗?
  9. libaio.so.1 mysql_libaio.so.1()(64bit) is needed by MySQL-server
  10. mysql怎么访问用户B_MySQL访问控制和用户管理