我也不知道什么是"莫比乌斯反演"和"杜教筛"

upd:正在写一篇复习向的文章,以后贴连接,能够做为这篇文章的一个补充。
upd:写好啦,戳这里。新写的这篇复习向文章QwQ,能够当作一个补充来看吧。不过新写的文章也有我新的理解吧。html

Part0

最近一直在搞这些东西
作了将近20道题目吧
也算是有感而发
写点东西记录一下本身的感觉函数

若是您真的想学会莫比乌斯反演和杜教筛,请拿出纸笔,每一个式子都本身好好的推一遍,理解清楚每一步是怎么来的,而且本身好好思考。spa

Part1莫比乌斯反演

莫比乌斯反演啥都没有,就只有两个式子(通常只用一个)
原来我已经写过一次了,再在这里写一次
就只写经常使用的那个吧rest

基本的公式


对于一个函数\(f(x)\)
\(g(x)=\sum_{x|d}f(d)\)
那么
\[f(x)=\sum_{x|d}\mu(\frac{d}{x})g(d)\]htm


这个有什么用?
彷佛太有用了一点blog

随手搞道题目来讲吧递归


\[\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]\]get

这个东西很直接,
因此咱们设\[f(x)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=x]\]
\[g(x)=\sum_{x|d}f(d)\]
根据莫比乌斯反演能够获得
\[f(1)=\sum_{1|d}\mu(\frac{d}{1})g(d)=\sum_{i=1}^n\mu(i)g(i)\]
\(g(x)\)是什么东西?
\[g(x)=\sum_{i=1}^n\sum_{j=1}^m[x|gcd(i,j)]\]
直接把\(x\)除到上面去
\[g(x)=\sum_{i=1}^{n/x}\sum_{j=1}^{m/x}[1|gcd(i,j)]\]
\([1|gcd]\)显然成立的
因此\(g(x)=[\frac{n}{x}][\frac{m}{x}]\)
能够\(O(1)\)计算
因此,\(f(1)\)能够\(O(n)\)计算博客


一块儿推下式子

莫比乌斯反演的套路太多了class

咱们再来看两道题目
Crash的数字表格
jzptab

这两题按照顺序看嗷

具体的过程直接看我博客里面写的东西

咱们发现这两道题如出一辙
可是下面的那道题目能够作到单次询问\(O(\sqrt n)\)

他多干了什么???
这个问题,咱们本身再来从新推一下
不过找个容易点的东西


\[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\]

这个确定没有前面我给的例子的莫比乌斯反演那么直接
可是咱们观察一下,\(gcd\)的取值有哪些??
\(1~n\)(假设\(n<m\))
那么,咱们能够把\(gcd\)相同的项合并

因此,咱们枚举\(gcd\)的值
\[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d]\]
后面的那一部分是否是想到了前面推出的东西???
因此先把\(d\)直接除上去
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)=1]\]
\(n/d\)\(m/d\)不要想太多,你就当成\(x\)\(y\)
\[\sum_{i=1}^{x}\sum_{j=1}^{y}[gcd(i,j)=1]\]
不就是上面推过的第一个例子??
\[=\sum_{i=1}^x\mu(i)[\frac{x}{i}][\frac{y}{i}]\]

把这一截放回咱们要求的式子里面去
\[\sum_{d=1}^nd\sum_{i=1}^{x}\mu(i)[\frac{x}{i}][\frac{y}{i}]\]
\(x,y\)仍是写成原样吧
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}][\frac{m}{id}]\]

是否是\(n/d\)能够数论分块
而在计算后面的东西的时候,\(\frac{n/d}{i}\)也能够数论分块??
因此这个时候的复杂度是\(O(n)\)
与之相对应的就是上面Crash的数字表格\(O(n)\)作法

但是,像下面那个\(O(\sqrt n)\)是怎么作的呢?

那咱们就继续推一步
咱们是否是能够直接对\(\frac{n}{id}\)分块呢?
因此,咱们设\(T=id\)\(id\)换一下
\[\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)[\frac{n}{T}][\frac{m}{T}]\]
这个时候,比较关键的一步
\(T\)提出来
\[\sum_{T=1}^n[\frac{n}{T}][\frac{m}{T}]\sum_{d|T}d\mu(\frac{T}{d})\]
为何是这个??
咱们来分析一波
首先每个\(T\)必定对应\([\frac{n}{T}][\frac{m}{T}]\)
这一项之和\(T\)有关,因此能够提出来

这个时候考虑对于每个\(T\),什么样的\(i\)\(d\)会给他产生贡献呢?
最显然的一点,\(d\)\(T\)的一个因数
看到上面的式子,咱们不难发现会贡献一个\(d\)的什么东西
后面的是什么?\(\mu(i)\)
继续想一想,既然\(T=id\),咱们枚举了一个\(T\)
又知道\(d\)\(T\)的一个因子了,因此\(i=\frac{T}{d}\)
因此,就有了上面把\(T\)拿出来的式子

前面的东西看起来能够数论分块
可是这样子后面的东西怎么办?
不可能\(O(\sqrt n)\)暴力枚举呀

没错,固然不须要暴力枚举
咱们发现后面的东西也是一个积性函数(由于他是两个积性函数的狄利克雷卷积)
因此它是能够线性的筛出来的
到这里,前面对于\(T\)数论分块
后面的前缀和能够\(O(n)\)线性筛预处理出来
此时单次询问总体的复杂度就是\(O(\sqrt n)\)

对了,不要思想江化
后面那个东西若是不可以直接线性筛
那就不要线性筛了,
只要复杂度容许,暴力筛也是很能够的


其实,若是咱们继续观察,很容易知道一点:
\(\sum_{d|T}d\mu(\frac{T}{d})=\varphi(T)\)

upd:原来底下的证实是假的,已经删掉了,这里用容斥的方法很容易证实,考虑到\(\mu\)是容斥系数就能够很容易的知道上述式子的组合意义。

咱们知道\((1*\varphi)(i)=i\)
还知道\((1*\mu)(i)=e\)
其中\(1\)\(f(x)=1\)
\(e\)\(f(x)=[x=1]\)
\(id\)\(f(x)=x\)

因此这个东西固然能够线性筛啦。


莫比乌斯反演差很少就到这里啦
咱们经历的复杂度从\(O(n^2)\)的暴力
推一步以后变成了\(O(n)\)
再变成了\(O(\sqrt n)\)

莫比乌斯反演的关键步骤也就是两步
首先是化简式子,写成莫比乌斯反演的形式
而后就是怎么处理前缀和,数论分块等东西的问题

这些可以解决好,莫比乌斯反演的题目就很好解决啦

Part2线性筛

固然是怎么各类线性筛东西啦

线性筛最重要的一点:
每一个数必定,也只会,被他的最小质因子给筛到
说白点,好比说\(72=2*2*2*3*3\)
他就会被他的最小质因子给筛到
也就是\(2*36\)时被筛到

因此,通常线性筛若是要存储其余的东西来筛的话
必定是记录最小质因子的东西

大概的写一下几个积性函数:

\(\mu\)莫比乌斯函数

这个怎么筛应该都会吧

\(\varphi\)欧拉函数

怎么筛应该也很明显吧。

\(d\)约数个数

这个怎么筛?
考虑惟一分解定理:
\(x=\prod p_i^{ai}\)
那么\(d(x)=\prod (ai+1)\)
记录一下最小质因子的个数
每次就先把原来的除掉,再把\(+1\)后的个数乘上就好啦

\(\sigma\)约数和

仍是惟一分解定理
\(x=\prod p_i^{ai}\)
\(\sigma(x)=\prod (\sum_{j=0}^{ai}p_i^j)\)
记录一下最小质因子的上面那个式子的和
以及这个因子的\(ai\)次幂
每次也是先除掉再乘上新的

\(a^k\) \(k\)次幂

把这个东西写进来,只是为了提醒一下
\(a^k\)这种东西是一个彻底积性函数,也是能够丢进去筛的

\(inv\)乘法逆元

没啥,同样的,乘法逆元也是彻底积性函数
蛤,我知道能够\(O(n)\)递推
只是写一下而已


我比较懒,不想把板子蒯过来
直接把ppl的连接给大家嗷(虽然他的代码风格我以为很丑)

Part3杜教筛

来个栗子

线性筛\(O(n)\)复杂度,美滋滋
好的,我知道了
来一个很\(interesting\)的题目???

\[求\sum_{i=1}^n\mu(i)的值\]

我固然知道你会线性筛
因此\(n<=10^9\)

杜教筛是蛤?

好比说。。
咱们如今要求一个积性函数\(f(i)\)的前缀和\(S(i)\)
也就是说\(S(n)=\sum_{i=1}^nf(i)\)

如今很很差算呀
怎么办??

这个时候,就来杜教筛套路一波

我再来找个积性函数\(g(i)\)(不知道是啥)
\(g\)\(f\)作一个卷积
\[(g*f)(i)=\sum_{d|i}g(d)f(\frac{i}{d})\]
再求一下卷积的前缀和
\[\sum_{i=1}^n(g*f)(i)=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})\]
\(d\)给提出来
\[\sum_{d=1}^ng(d)\sum_{d|i}f(\frac{i}{d})\]
\[\sum_{d=1}^ng(d)\sum_{i=1}^{n/d}f(i)\]
\[\sum_{d=1}^ng(d)S(\frac{n}{d})\]
若是仔细想一想
咱们就会有这个式子:
\[g(1)S(n)=\sum_{i=1}^ng(i)S(\frac{n}{i})-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
前面的东西是狄利克雷卷积
\[g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
若是狄利克雷卷积的前缀和很是好算的话
那么咱们就能够对后面的东西进行数论分块
而后递归计算。
提醒一句:
必定要记忆化,必定要记忆化,必定要记忆化

回到栗子

\(\sum_{i=1}^n\mu(i)\)
把杜教筛的公式套路式子找过来蛤
\[g(1)S(n)=\sum_{i=1}^n(g*\mu)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
看到了\(\mu\)想一个积性函数,让他们的狄利克雷卷积前缀和很好算
咱们知道
\[\sum_{d|i}\mu(d)=[i=1]=e\]
也就是说
\[(1*\mu)=e\]
\(e\)的前缀和是啥?
固然是\(1\)
因此,取\(g(x)=1\)
\[S(n)=1-\sum_{i=2}^nS(\frac{n}{i})\]
这样子的话,首先线性筛出一部分的\(\mu\)的前缀和
而后来一波记忆化搜索美滋滋


再来个栗子把
把上面的\(\mu\)换成\(\varphi\)
咱们仍是知道
\[\sum_{d|i}\varphi(d)=i=id(i)\]
因此,若是是\(\varphi\)的话
就令\(g(x)=1\)
因此,
\[S(n)=\frac{n*(n+1)}{2}-\sum_{i=2}^nS(\frac{n}{i})\]

多好的套路

可是,不要被套路给套死啦
面对不一样的函数
必定要考虑清楚\(g\)是啥
好的\(g\)能让你的程序更加好算

Part4我也不知道为何要加上这一部分

好啦
上面好好地写了一下莫比乌斯反演和杜教筛
是否是以为很简单

固然,莫比乌斯反演和杜教筛固然能够混在一块儿

莫比乌斯反演推柿子
杜教筛求前缀和
一点也不矛盾


既然我也不知道最后这部分干啥
那就找一堆题目来吧
欢迎查我水表
算了
仍是把水表给大家把
莫比乌斯反演的水表
杜教筛的水表


最后,说几句话
不要由于有了杜教筛和线性筛
就每天想着怎么筛
筛不了就滚去写暴力
埃氏筛法很不错
暴力枚举因数也很不错

最后,一句最经典的话做为结尾

骗分过样例,暴力出奇迹

相关文章
相关标签/搜索