【学习笔记】莫比乌斯反演(入门)

这文章好水啊。。。

公式:

原始版:

\[g(x)=\sum_{d|x}f(d)\Leftrightarrow f(x)=\sum_{d|x}\mu(\frac{x}{d})g(d) \]

推论式:

\[g(x)=\sum_{x|d}f(d)\Leftrightarrow f(x)=\sum_{x|d}\mu(\frac{d}{x})g(d) \]

简单应用:

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

\(f(x)=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^m[\gcd(i,j)=x]\)\(g(x)=\displaystyle\sum_{x|d}f(d)\).

根据莫比乌斯反演可得:\(f(x)=\displaystyle\sum_{x|d}\mu(\frac{d}{x})g(d)\).

\(g(x)=\displaystyle\sum_{i=1}^n\sum_{j=1}^m[x|\gcd(i,j)]\)

\(=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}[1|\gcd(i,j)]\)

\(={\lfloor\frac{n}{x}\rfloor}\times {\lfloor\frac{m}{x}\rfloor}\)

所以\(f(x)=\displaystyle\sum_{i=1}^{\lfloor\frac{\min(n,m)}{x}\rfloor}\mu(i)g(i\cdot x)=\displaystyle\sum_{i=1}^{\lfloor\frac{\min(n,m)}{x}\rfloor}\mu(i)\times {\lfloor\frac{n}{ix}\rfloor}\times {\lfloor\frac{m}{ix}\rfloor}\)

引理1:\({\lfloor\frac{n}{ab}\rfloor}={\lfloor\frac{\lfloor\frac{n}{a}\rfloor}{b}\rfloor}\).

引理2:设集合\(S=\{{\lfloor\frac{n}{x}\rfloor}|1\leq x\leq n,x\in \mathbb{N}\}\),则\(|S|=O(\sqrt{n})\).

证明都略了

\(f(x)=\displaystyle\sum_{i=1}^{\lfloor\frac{\min(n,m)}{x}\rfloor}\mu(i)\times {\lfloor\frac{\lfloor\frac{n}{x}\rfloor}{i}\rfloor}\times {\lfloor\frac{\lfloor\frac{m}{x}\rfloor}{i}\rfloor}\)

预处理出\(\mu(i)\)的前缀和即可\(O(\sqrt{n})\)回答每次询问。总复杂度\(O(n+\sqrt{n})\).

例题1:YY的GCD

求:

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

多组测试数据,\(1\leq n,m\leq 10^7,1\leq T\leq 10^4\).


\(\text{原式}=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{p\in prime}[\gcd(i,j)=p]\)

\(=\displaystyle\sum_{p\in prime}\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=p]\)

\(=\displaystyle\sum_{p\in prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[\gcd(i,j)=1]\)

\(f(n,m,x)=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=x]\).

\(g(n,m,x)=\displaystyle\sum_{x|d}f(n,m,d)\).

\(g(n,m,x)=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}[x|\gcd(i,j)]\)

\(=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}[1|\gcd(i,j)]\)

显然对于任意\(i,j\in\mathbb{N_+}\)\([1|\gcd(i,j)]\)成立,所以\(g(n,m,x)={\lfloor\frac{n}{x}\rfloor}{\lfloor\frac{m}{x}\rfloor}\).

所以\(f(n,m,x)=\displaystyle\sum_{x|d}\mu(\frac{d}{x})g(n,m,d)\)

则我们要求的是\(\displaystyle\sum_{p\in prime}f(\lfloor\frac{n}{p}\rfloor,\lfloor\frac{m}{p}\rfloor,1)\)

\(=\displaystyle\sum_{p\in prime}\sum_{d=1}^{n}\mu(d)\lfloor\frac{n}{dp}\rfloor\lfloor\frac{m}{dp}\rfloor\)

这个\(dp\)比较丑,我们把它换成\(i\),得到

\(\displaystyle\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor\sum_{p\in prime,p|i}\mu(\frac{i}{p})\).

后面\(\displaystyle\sum_{p\in prime,p|i}\mu(\frac{i}{p})\)我们是可以提前预处理出来的,这样用整除分块就可以\(O(\sqrt{n})\)回答每次询问了。

参考代码

例题2:[SDOI2015]约数个数和

定义\(d(x)\)\(x\)的约数个数。

求:

\[\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij) \]

多组测试数据,\(1\leq n,m,T\leq 5\times 10^4\).


初步转化:

\[d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1] \]

证明:设\(ij=\displaystyle\prod_{t} p_t^{e_t}\),对于任意一个\(p_t\),设\(i\)\(e_t\)的贡献为\(a\)\(j\)\(e_t\)的贡献为\(b\),即\(a+b=e_t\)。对于一个\(ij\)的一个约数\(w\):如果\(w\)\(p_t\)的次数\(c\leq a\),我们在\(i\)里计算它;否则,我们在\(j\)里计算\(c-a\)。即:\(x\)里一个\(p^c\)表示当前\(ij\)的这个因数里有\(p^c\)\(y\)里一个\(p^c\)表示当前\(ij\)的这个因数里有\(p^{c+a}\)。这样只要\(x,y\)互质,就保证了不重不漏的计数。

接下来我们就可以快乐地推式子了。

原式\(=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\)

交换和式:

\(=\displaystyle\sum_{x=1}^{n}\sum_{y=1}^{m}\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{y}\rfloor}[\gcd(x,y)=1]\)

\(=\displaystyle\sum_{x=1}^{n}\sum_{y=1}^{m}{\lfloor\frac{n}{x}\rfloor}{\lfloor\frac{n}{y}\rfloor}[\gcd(x,y)=1]\)

开始反演。(把\(x,y\)换成\(i,j\)使式子更好看一点)

\(g(x)=\displaystyle\sum_{x|d}f(d)\)

\(=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{j}\rfloor[x|\gcd(i,j)]\)

\(=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}\lfloor\frac{n}{xi}\rfloor\lfloor\frac{m}{xi}\rfloor\)

代回去:\(f(x)=\displaystyle\sum_{x|d}\mu(\frac{d}{x})g(d)\)

我们要求的其实是:\(f(1)=\displaystyle\sum_{i=1}^{n}\mu(i)g(i)\).

我们在\(O(n\sqrt{n})\)的时间内,枚举每个\(x\)并预处理出\(s(x)=\displaystyle\sum_{i=1}^{x}\lfloor\frac{x}{i}\rfloor\)的值。

则答案就是\(f(1)=\displaystyle\sum_{i=1}^{n}\mu(i)s(\lfloor\frac{n}{i}\rfloor)s(\lfloor\frac{m}{i}\rfloor)\),预处理出\(\mu\)的前缀和即可用整除分块\(O(\sqrt{n})\)回答询问。

参考代码

例题3:bzoj2693 jzptab

求:

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

多组测试数据,\(1\leq n,m\leq 10^7,1\leq T\leq 10^4\).


这题有个弱化版,没有多测。我们从这里讲起。

原式\(=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)}\)

\(=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{k=1}^{\min(n,m)}\frac{ij}{k}[\gcd(i,j)=k]\)

\(=\displaystyle\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ijk[\gcd(i,j)=1]\)

\(=\displaystyle\sum_{k=1}^{\min(n,m)}k\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij[\gcd(i,j)=1]\)

套用莫比乌斯反演。

\(f(n,m,x)=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}ij[\gcd(i,j)=x]\).

\(g(n,m,x)=\displaystyle\sum_{x|d}f(n,m,d)\).

\(g(n,m,x)=\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}ij[x|\gcd(i,j)]\)

\(=x^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}ij[1|\gcd(i,j)]\)

\(=x^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}ij\)

\(i\)提到前面,得到:

\(=x^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}j\)

等差数列求和:

\(=x^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}i\frac{{\lfloor\frac{m}{x}\rfloor}\times ({\lfloor\frac{m}{x}\rfloor}+1)}{2}\)

\(=x^2\frac{{\lfloor\frac{n}{x}\rfloor}\times ({\lfloor\frac{n}{x}\rfloor}+1)}{2}\cdot\frac{{\lfloor\frac{m}{x}\rfloor}\times ({\lfloor\frac{m}{x}\rfloor}+1)}{2}\)

代回去得到:

\(f(n,m,x)=\displaystyle\sum_{x|d}\mu(\frac{d}{x})g(n,m,d)\)

\(f(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor,1)=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\mu(i)\cdot i^2\cdot \frac{{\lfloor\frac{n}{ki}\rfloor}\times ({\lfloor\frac{n}{ki}\rfloor}+1)}{2}\cdot\frac{{\lfloor\frac{m}{ki}\rfloor}\times ({\lfloor\frac{m}{ki}\rfloor}+1)}{2}\)

于是我们就可以\(O(\sqrt{n})\)计算\(f(n,m,k)\).

所以,原式\(=\displaystyle\sum_{k=1}^{n}k\times f(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor,1)\),就可以在\(O(\sqrt{n})\times O(\sqrt{n})=O(n)\)的时间内算出了。

参考代码


然后来看bzoj这个题。因为要多测,我们\(O(n)\)的复杂度不够优秀。

为了方便,我们设\(S(i,j)=\sum_{i=1}^{n}\sum_{j=1}^{m}ij\).

则原式\(=\displaystyle\sum_{k=1}^{n}k\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\mu(i)\cdot i^2\cdot S(\lfloor\frac{n}{ki}\rfloor,\lfloor\frac{m}{ki}\rfloor)\).

\(T=ki\),把\(S(\lfloor\frac{n}{ki}\rfloor,\lfloor\frac{m}{ki}\rfloor)\)提前,可得:

\(\displaystyle\sum_{T=1}^{n}S(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)\sum_{i|T}\mu(i)\cdot i^2\cdot\frac{T}{i}\)

\(=\displaystyle\sum_{T=1}^{n}S(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)\sum_{i|T}\mu(i)\cdot i\cdot T\)

后面的部分\(f(T)=\displaystyle\sum_{i|T}\mu(i)\cdot i\cdot T\)显然是一个积性函数,所以我们考虑用线性筛将它预处理出来。

  • \(n=1\)时,显然有\(f(n)=1\)

  • \(n\)为素数时,显然有\(f(n)=n-n^2\)

  • \(n\)为合数时,设\(n=i\cdot p_j\)\(p_j\)是质数)。如果\(p_j|i\),那么\(\mu(i\cdot p_j)\)一定为\(0\),也就是说没有新增项。因此\(f(i\cdot p_j)\)相较于\(f(i)\)而言只是每项中的\(T\)变了,所以\(f(n)=f(i)\cdot p_j\)

预处理出\(f\)的前缀和后我们就可以\(O(\sqrt{n})\)回答每次询问了。

参考代码

posted @ 2020-02-24 22:35  duyiblue  阅读(1160)  评论(1编辑  收藏  举报