Loading

【笔记】莫比乌斯反演/筛法

来自\(\texttt{Sharpness}\)省选复习计划中的莫比乌斯反演/筛法


例题1

线性筛素数,每个数只会被它最小质因子筛掉,借此我们可以线性求出很多积性函数如$\mu\ ,\ \varphi $等。

例题2

整除分块,给定\(n\),则\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的取值不超过\(\sqrt{N}\)种,因为\(i\le \sqrt{N}\)时不超过\(\sqrt{N}\)种取值,\(>\sqrt{N}\)时也不超过\(\sqrt{N}\)

所以我们可以把所有\(\left\lfloor\dfrac{n}{i}\right\rfloor\)相同的\(i\)分到一段。总共不超过\(\sqrt{N}\)段。

整除分块的写法可以直接套用。

代码

例题3

\([L,R]\)选出\(N\)个数使得他们的\(\gcd=K\)。不妨将所有数\(/k\),将问题转换为在\([L',R']\)中选取\(N\)个数使得\(gcd=1\)。显然这可以直接暴算了。

题目给出\(R-L\le10^5\),考虑更简单的方法。我们可以先求出\(f[i]\)表示公约数为\(i\)的方案数,再通过\(f[k\times i],k\in N^{+}\),容斥求出最大公约数为\(i\)的方案数。

代码


迪利克雷卷积

\(h=f*g\),则有\(h(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})\)

性质 \(1\):若\(f,g\)为积性函数,则\(f*g\)也为积性函数。

证明:

  • 如果$p\perp q $,则 \(w|pq\)\(w=uv,u|p\land v|q\)一一对应 。因为\(w\)的每一个质因子可以唯一分配到 \(p\) 或者 \(q\) 中。
  • 所以\(h(p\times q)=\sum\limits_{w|pq}f(w)g(\dfrac{pq}{w})=\sum\limits_{u|p,v|q}f(u)f(v)g(\dfrac{p}{u})g(\dfrac{q}{v})=h(p)h(q)\)

反演

性质 \(2\)\(\mu *1=\epsilon\)

应用:\(\begin{aligned} \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[\gcd(i,j)=1]=& \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\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor \end{aligned}\)

性质 \(3\)\(\varphi*1=\rm Id\)

应用:\(\begin{aligned} \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\gcd(i,j)=& \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|i,j}\varphi(d)\\=&\sum\limits_{d=1}^{\min(n,m)}\varphi(d)\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor \end{aligned}\)


例题4

莫比乌斯反演模板题。

利用性质 \(2\) ,用线性筛预处理\(\mu\),然后整除分块可以做到\(\rm O(T\sqrt{N})\)

代码

例题5

经典 \(\texttt{trick}\) : \(\sigma(ij)=\sum\limits_{a=1}^{i}\sum\limits_{b=1}^{j}[\gcd(a,b)=1]\)

然后利用性质\(2\)求解即可。

代码


杜教筛

杜教筛用来在优于线性的时间复杂度内求出积性函数的前缀和。

如果我们需要求积性函数 \(f\) 的前缀和 \(S\),我们可以找一个合适的函数 \(g\),令\(h=f*g\)

\[\begin{aligned}\sum\limits_{i=1}^nh(i)=& \sum\limits_{i=1}^{n}\sum\limits_{d|i}g(d)f(\dfrac{i}{d}) \\=& \sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\frac{n}{d}}f(i)\\=&\sum\limits_{d=1}^n g(d)S(\dfrac{n}{d})\end{aligned}\]

所以有

\[\sum\limits_{i=1}^nh(i)-\sum\limits_{d=2}^n g(d)S(\dfrac{n}{d})=g(1)S(n) \]

如果我们选取的\(g\)函数能使得\(\sum h(i)\)快速求出,我们可以将这个问题递归分解下去。由问题\(S(n)\)分解到\(S(\dfrac{n}{d})\)。并不难得到一个时间复杂度为\(\rm O(N^{\frac{3}{4}})\)

考虑优化,我们可以将所有\(\le M\)\(S(i)\) 全部筛出来,不难证得当\(M=N^{\frac{2}{3}}\)时,时间复杂度最优且为\(\rm O(N^{\frac{2}{3}})\)


例题6

利用\(\mu,\varphi\)函数的性质。\(\mu *1=\epsilon\)\(\varphi*1=\rm Id\),其中函数 \(1,\epsilon,\rm Id\) 的前缀和都可以 \(\rm O(1)\) 求得,直接套用上面的公式即可。

代码

例题7

转化一下,发现我们需要求\(\sum\limits_{i=1}^{n}i^2\varphi(i)\)

根据套路,我们令\(f(n)=n^2\varphi(n)\)\(g(n)=n^2\)。令\(h=f*g\),有:

\[\begin{aligned}h(n)=&\sum\limits_{d|n}f(d)g(\frac{n}{d})\\=&n^2\sum\limits_{d|n}\varphi(d)\\=&n^3\end{aligned} \]

\(g,h\)的前缀和都非常好求,而\(f\)又是个积性函数,所以直接上杜教筛即可。

代码

好现在你已经精通莫反和基础筛法了,试着完成下面的练笔吧XD。

T1代码

T2代码

posted @ 2022-04-14 10:02  7KByte  阅读(120)  评论(0编辑  收藏  举报