【学习笔记】莫比乌斯反演(入门)
这文章好水啊。。。
公式:
原始版:
推论式:
简单应用:
设\(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
求:
多组测试数据,\(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\)的约数个数。
求:
多组测试数据,\(1\leq n,m,T\leq 5\times 10^4\).
初步转化:
证明:设\(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
求:
多组测试数据,\(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})\)回答每次询问了。