莫比乌斯反演与杜教筛 笔记
侵删
以下内容均来自TA爷课件,我只是改了几个小的地方qwq
如果想要博客园中这篇文章更好的阅读体验,请移步蚂蚁笔记
或者使用对LaTeX公式支持比较好的Chrome浏览器阅读(其他浏览器显示的公式为什么辣么粗糙啊qwq)
枚举除法
- \(\left\lfloor\frac{n}{i}\right\rfloor\)只有\(O\left(\sqrt{n}\right)\)种取值。
- 对于\(i\),\(\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\)是与\(i\)被\(n\)除并下取整取值相同的一段区间的右端点。
- 一个很有用的性质:\(\left\lfloor\frac{n}{ab}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{n}{b}\right\rfloor}{a}\right\rfloor\)
- 上取整也有3所述的性质。
积性函数
- \(f(ab)=f(a)f(b),(a,b)=1\)
- 完全积性:不要求\((a,b)=1\)
- 考虑时一般会考虑成\(f(x)=\prod\limits_{i}f\left(p_i^{k_i}\right)\)
- 当\(f\)不是0的常值函数时,\(f(1)=1\)
- 积性函数的狄利克雷前缀和也是积性函数。
\[s(n)=\sum\limits_{d|n}f(d)=\prod\limits_{i}\sum\limits_{j=0}^{k_i}f\left(p_i^j\right)\] - 两个积性函数的狄利克雷卷积也是积性函数。
\[c(n)=\sum\limits_{d|n}a(d)b\left(\frac{n}{d}\right)=\prod\limits_{i}\sum\limits_{j=0}^{k_i}a\left(p_i^j\right)b\left(p_i^{k_i -j}\right)\] - 积性函数可以线性筛出。线筛可以找到每个数\(x\)的最小质因子\(p_1\)及其次数\(k_1\)。如果我们能以较小的代价(\(O(1)\))求出\(f\left(p_1^{k_1}\right)\),便可以线筛了。
初等积性函数\(\mu\)
- 栗子:给定\(n\),\(m\),求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[i\bot j],n,m \leqslant 10^9\),不用\(\mu\)怎么做?
容斥!设dp数组\(f(i,j)\)为当\(n=i,m=j\)时的答案。
\[f(n,m)=nm-\sum\limits_{i=2}^{\min(n,m)}f\left(\left\lfloor\frac{n}{i}\right\rfloor,\left\lfloor\frac{m}{i}\right\rfloor\right)\]
时间复杂度\(O\left(\sum\limits_{i=1}^{\left\lfloor\sqrt{n}\right\rfloor}\left(\sqrt{\left\lfloor\frac{n}{i}\right\rfloor}+\sqrt{i}\right)\right)=O\left(n^{\frac{3}{4}}\right)\)
那么\(\mu\)是什么?就是容斥系数!
\[\mu(1)=1,\mu(2)=-1,\mu(3)=-1,\mu(4)=0,\mu(5)=-1\dots\]
\[\mu(n)=\left\{\begin{array}{rcl}0&,&\exists x^2|n\\(-1)^k&,&n=\prod\limits_{i=1}^{k}p_i\end{array}\right.\]
\(\mu\)显然是一个积性函数。 - \[\sum\limits_{d|n}\mu(d)=\left\{\begin{array}{rcl}0&,&n=1\\1&,&n\neq1\end{array}\right.\]
- 莫比乌斯反演
\[F(n) =\sum\limits_{d|n}f(d)\]
\[f(n) =\sum\limits_{d|n}F(d)\mu\left(\frac{n}{d}\right)=\sum\limits_{d|n}f(d)\sum\limits_{g|\frac{n}{d}}\mu(g)=f(n)\]
\[F(n) =\sum\limits_{n|d}f(d)\]
\[f(n) =\sum\limits_{n|d}F(d)\mu\left(\frac{d}{n}\right)=\sum\limits_{n|d}f(d)\sum\limits_{g|\frac{d}{n}}\mu(g)=f(n)\] - 回到栗子:
\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m[i\bot j]=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{d|(i,j)}\mu(d)=\sum\limits_{d=1}^{\min(n,m)}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor\]
当然这样还是做不了。。。
所以我们需要杜教筛!(后面再说吧。。)
不过大多数\(\mu\)的题(第一步)这么化,所以这个式子还是比较重要的。
初等积性函数\(\varphi\)
- \(\varphi(n)=1~n与n互质的数的个数\)
所以由定义便可直接写出:
\[\varphi(n)=\sum\limits_{d|n}\mu(d)\frac{n}{d}=\prod\limits_{i}\sum\limits_{j=0}^{k_i}\mu\left(p_i^j\right)p^{k_i -j}=\prod\limits_{i}p_i^{k_i -1}(p_i -1)\]
这样就可以线筛出来了,而且可以看出\(\varphi\)是一个积性函数。 - 从刚才的式子可以看出,\(\varphi\)完全可以用\(\mu\)代替,那么我们为什么需要\(\varphi\)呢?
很大一部分原因是它定义比较直观,比较容易想到。 - \(\varphi\)的性质:\[\sum\limits_{d|n}\varphi(d)=\sum\limits_{d|n}d\sum\limits_{g|\frac{n}{d}}\mu(g)=n\]
- 栗子:求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(i,j)\),多组数据,\(t,n,m\leqslant 10^5\)。
\[ans=\sum\limits_{i=1}^{\min(n,m)}\varphi(i)\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor\]
杜教筛
- 求\(\sum\limits_{i=1}^n\mu(i),n\leqslant 10^{11}\)
直接求不好求,但是我们有\(\sum\limits_{i=1}^n\sum\limits_{d|i}\mu(d)=1\)
化一下蛤:\(\sum\limits_{i=1}^n\sum\limits_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}\mu(j)=1\),\(\sum\limits_{i=1}^n\mu(i)=1-\sum\limits_{i=2}^n\sum\limits_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}\mu(j)\)
核心思想是枚举约数,这样就可以递推/递归求解了。
时间复杂度\(O\left(n^{\frac34}\right)\)。
但是注意到当\(n\)比较小的时候其实我们可以\(O(n)\)线筛出来。
所以我们考虑分类讨论,线筛出≤B的,>B的递推。
时间复杂度\(O\left(B+\sum\limits_{i=1}^{\frac nB}\sqrt{\frac ni}\right)=O\left(B+\frac n{\sqrt{B}}\right)\)
求导一下可知在\(B=n^{\frac23}\)时取得最小值\(O\left(n^\frac23\right)\)。 - 回到栗子:这样的话最初的栗子就会做了吧~
\[\sum_{i=1}^n\sum_{j=1}^m[i\bot j]=\sum_{i=1}^n\sum_{j=1}^m\sum_{d|(i,j)}\mu(d)=\sum_{d=1}^{min(n,m)}\mu(d)\left\lfloor\frac nd\right\rfloor\left\lfloor\frac md\right\rfloor\]
注意到杜教筛的时候不仅是求出了\(\sum\limits_{j=1}^n\mu(j)\),还顺便求出了所有的\(\sum\limits_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)\),所以可以和普通的枚举除法完美契合。 - 那么怎么求\(\sum\limits_{i=1}^n\varphi(i)\)?
\[\frac{n(n+1)}2=\sum_{i=1}^n\sum_{d|i}\varphi(d)=\sum_{i=1}^n\sum_{j=1}^{\left\lfloor\frac ni\right\rfloor}\varphi(j)\]
下面讲些题吧~(不一定都是反演哦)
- 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\leq10^{11}\)
\[ \begin{aligned}&\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\\=&\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{(i,j)}\\=&\sum_{i=1}^{\min(n,m)}i\sum_{j=1}^{\min\left(\left\lfloor\frac ni\right\rfloor,\left\lfloor\frac mi\right\rfloor\right)}\mu(j)j^2\frac{\left\lfloor\frac n{ij}\right\rfloor\left(\left\lfloor\frac n{ij}\right\rfloor+1\right)}2\frac{\left\lfloor\frac m{ij}\right\rfloor\left(\left\lfloor\frac m{ij}\right\rfloor+1\right)}2\end{aligned} \]
如果我们可以杜教筛出\(\sum\limits_{i=1}^n\mu(i)i^2\),就可以做到\(O\left(n^{\frac34}\right)\)。
这是可以的
\[1=\sum_{i=1}^n\sum_{d|i}\mu(d)d^2\left(\frac id\right)^2=\sum_{i=1}^ni^2\sum_{j=1}^{\lfloor\frac ni\rfloor}\mu(j)j^2\]
但是我们当然不必这么做。
可以直接令\(f(n,m)\)表示(1~n,1~m)中所有互质数对乘积和。
那么\(f(n,m)=\frac{n(n+1)m(m+1)}4-\sum\limits_{i=2}^{\min(n,m)}i^2f\left(\left\lfloor\frac ni\right\rfloor,\left\lfloor\frac mi\right\rfloor\right)\),直接dp就好了。
但是我们需要\(O\left(n^\frac 23\right)\)
\[\sum_{i=1}^{\min(n,m)}\frac{\left\lfloor\frac ni\right\rfloor\left(\left\lfloor\frac ni\right\rfloor+1\right)\left\lfloor\frac mi\right\rfloor\left(\left\lfloor\frac mi\right\rfloor+1\right)}4i\sum_{d|i}\mu(d)d\]
枚举除法,我们便只需求\(\sum\limits_{i=1}^ni\sum\limits_{d|i}\mu(d)d\)
它等于\(\sum\limits_{i=1}^ni\sum\limits_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)j^2\)
我们先求出\(\sum\limits_{i=1}^n\mu(i)i^2\)
这个刚才已经讲过了。
然后前者便可以预处理+直接求。
预处理的时候需要线性筛
\[\sum_{d|n}\mu(d)d=\prod_i\left(1-p_i\right)\]
这题中涉及一种很重要的杜教筛的思路。
就是对于不能直接杜教筛的式子,可以将其与另一个前缀和易求的积性函数狄利克雷卷积,使得卷积后的函数前缀和也易求。
比如这道题就是与\(f(x)=x^2\)卷积。
这道题也涉及到一些常见的化式子的方法。
\(\gcd\to\mu\),\(\mu\to\varphi\)
对于i,j,ij三项贡献的这种,可以枚举ij将其化为狄利克雷卷积,也可以枚举i和j化成带下取整的式子;一般来讲前者往往易于预处理,可以应付多组询问,后者则在单次询问中有优秀表现。 - SDOI2015 约数个数和
求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(i,j)\),多组数据,\(T,n,m\leq10^5\),\(d(i,j)=\sum\limits_{x|i}\sum\limits_{y|j}[x\bot y]\)
\[\begin{aligned}&\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[x\bot y]\\=&\sum_{i=1}^n\sum_{j=1}^m\left\lfloor\frac ni\right\rfloor\left\lfloor\frac mj\right\rfloor\sum_d\mu(d)[d|i][d|j]\\=&\sum_{d=1}^{\min(n,m)}\mu(d)\left(\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\left\lfloor\frac{\left\lfloor\frac nd\right\rfloor}i\right\rfloor\right)\left(\sum_{j=1}^{\left\lfloor\frac md\right\rfloor}\left\lfloor\frac{\left\lfloor\frac md\right\rfloor}j\right\rfloor\right)\end{aligned}\]
预处理\(O\left(n\log n\right)/O\left(n\sqrt n\right)\),查询\(O\left(T\sqrt n\right)\) - BZOJ2820 YY的gcd
求\((x,y)=质数\),\(x\in[1,n]\),\(y\in[1,m]\)的数对个数。多组数据,\(n,m\leq10^7\),\(T\leq10^4\)
\[\begin{aligned}&\sum_{p\leq \min(n,m)}\sum_{i=1}^{\left\lfloor\frac np\right\rfloor}\sum_{j=1}^{\left\lfloor\frac mp\right\rfloor}[i\bot j]\\=&\sum_{p\leq \min(n,m)}\sum_{i=1}^{\left\lfloor\frac np\right\rfloor}\sum_{j=1}^{\left\lfloor\frac mp\right\rfloor}\sum_d\mu(d)[d\bot i][d\bot j]\\=&\sum_{i=1}^n\left\lfloor\frac ni\right\rfloor\left\lfloor\frac mi\right\rfloor\sum_{p|i}\mu\left(\frac ip\right)\end{aligned}\]
预处理\(O(n)/O(n\lg\lg n)\),查询\(O(T\sqrt n)\) - FZU2016 how many tuples
有m个数,第i个数的取值范围是\([1,a_i]\),求这m个数gcd为1的方案数。多组数据,10s时限,\(t\leq10^3\),\(m\leq20\),\(ai\leq10^8\)
\[\sum_{i=1}^{\min(a_i)(1\leq i\leq m)}\mu(i)\prod_{j=1}^m\left\lfloor\frac{a_j}i\right\rfloor\]
直接杜教筛就可以了,杜教筛的时候预处理\(10^7\)。
枚举除法的时候需要用堆。时间复杂度\(O\left(Tm\sqrt A\log m\right)\) - CQOI2015 选数
求从\(\left[L,R\right]\)中选N个数,其gcd等于K的方案数。\(N,K,L,R\leq10^9\),\(R-L\leq10^5\)
如果N个数互不相同,那么gcd至多是R-L,所以我们分情况讨论。
所以设\(f(i)\)表示gcd是K*i的方案数,要求\(\left\lfloor\frac R{iK}\right\rfloor-\left\lfloor\frac{L-1}{iK}\right\rfloor>1\)
\[f(i)=\left(\left\lfloor\frac R{iK}\right\rfloor-\left\lfloor\frac{L-1}{iK}\right\rfloor\right)^N-\sum_{j=2}^{\left\lfloor\frac RK\right\rfloor-1}f(ij)\]
最后再加上\([L\leq K\leq R]\)
时间复杂度\(O\left((R-L)\log K\right)\)