莫比乌斯反演与杜教筛
侵删
以下内容均来自TA爷课件,我只是改了几个小的地方qwq
请关闭浏览器的极速模式后阅读(极速模式显示的公式为什么辣么粗糙啊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\)
- 积性函数的狄利克雷前缀和也是积性函数。
- 两个积性函数的狄利克雷卷积也是积性函数。
- 积性函数可以线性筛出。线筛可以找到每个数\(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\)时的答案。
时间复杂度\(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\)显然是一个积性函数。
2. $$\sum\limits_{d|n}\mu(d)=\left{\begin{array}{rcl}1&,&n=1\0&,&n\neq1\end{array}\right.$$
3. 莫比乌斯反演
- 回到栗子:
当然这样还是做不了。。。
所以我们需要杜教筛!(后面再说吧。。)
不过大多数\(\mu\)的题(第一步)这么化,所以这个式子还是比较重要的。
初等积性函数\(\varphi\)
- \(\varphi(n)=1~n与n互质的数的个数\)
所以由定义便可直接写出:
这样就可以线筛出来了,而且可以看出\(\varphi\)是一个积性函数。
2. 从刚才的式子可以看出,\(\varphi\)完全可以用\(\mu\)代替,那么我们为什么需要\(\varphi\)呢?
很大一部分原因是它定义比较直观,比较容易想到。
3. \(\varphi\)的性质:$$\sum\limits_{d|n}\varphi(d)=\sum\limits_{d|n}d\sum\limits_{g|\frac{n}{d}}\mu(g)=n$$
4. 栗子:求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(i,j)\),多组数据,\(t,n,m\leqslant 10^5\)。
杜教筛
- 求\(\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\limits_{j=1}^n\mu(j)\),还顺便求出了所有的\(\sum\limits_{j=1}^{\left\lfloor\frac ni\right\rfloor}\mu(j)\),所以可以和普通的枚举除法完美契合。
3. 那么怎么求\(\sum\limits_{i=1}^n\varphi(i)\)?
下面讲些题吧~(不一定都是反演哦)
- 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\leq10^{11}\)
如果我们可以杜教筛出\(\sum\limits_{i=1}^n\mu(i)i^2\),就可以做到\(O\left(n^{\frac34}\right)\)。
这是可以的
但是我们当然不必这么做。
可以直接令\(f(n,m)\)表示(1n,1m)中所有互质数对乘积和。
那么\(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\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\)
这个刚才已经讲过了。
然后前者便可以预处理+直接求。
预处理的时候需要线性筛
这题中涉及一种很重要的杜教筛的思路。
就是对于不能直接杜教筛的式子,可以将其与另一个前缀和易求的积性函数狄利克雷卷积,使得卷积后的函数前缀和也易求。
比如这道题就是与\(f(x)=x^2\)卷积。
这道题也涉及到一些常见的化式子的方法。
\(\gcd\to\mu\),\(\mu\to\varphi\)
对于i,j,ij三项贡献的这种,可以枚举ij将其化为狄利克雷卷积,也可以枚举i和j化成带下取整的式子;一般来讲前者往往易于预处理,可以应付多组询问,后者则在单次询问中有优秀表现。
2. 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]\)
预处理\(O\left(n\log n\right)/O\left(n\sqrt n\right)\),查询\(O\left(T\sqrt n\right)\)
3. BZOJ2820 YY的gcd
求\((x,y)=质数\),\(x\in[1,n]\),\(y\in[1,m]\)的数对个数。多组数据,\(n,m\leq10^7\),\(T\leq10^4\)
预处理\(O(n)/O(n\lg\lg n)\),查询\(O(T\sqrt n)\)
4. FZU2016 how many tuples
有m个数,第i个数的取值范围是\([1,a_i]\),求这m个数gcd为1的方案数。多组数据,10s时限,\(t\leq10^3\),\(m\leq20\),\(ai\leq10^8\)
直接杜教筛就可以了,杜教筛的时候预处理\(10^7\)。
枚举除法的时候需要用堆。时间复杂度\(O\left(Tm\sqrt A\log m\right)\)
5. 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\)
最后再加上\([L\leq K\leq R]\)
时间复杂度\(O\left((R-L)\log K\right)\)