「莫比乌斯反演」
Posted qixingzhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「莫比乌斯反演」相关的知识,希望对你有一定的参考价值。
引入
在考虑\(F(n)=\sum\limits_d|nf(d)\)时,假设已知函数\(F\),能不能通过若干\(F(i)\)的加减得到\(f(j)\)呢?找规律后发现好像可以,并且好像用到的\(i\)都是\(j\)的因数。由此我们能不能通过给每个因子的\(F\)乘上一个系数,可以是0或1或-1,这样来得到\(f(j)\)呢?也就是,我们猜想是否有一个函数\(\mu\)能够使得\(f(n)=\sum\limits_d|n\mu(d)F(\dfracnd)\)呢?我们称这个过程为反演,其中\(\mu\)就是莫比乌斯函数。
莫比乌斯函数\(\mu\)的定义
特殊地,\(\mu(1)=1\),对于其他情况
\(\mu(d)=\begincases(-1)^k& d=p_1*p_2*...*p_k\\0& otherwise\endcases\)
莫比乌斯函数的性质
[ 性质 1 ] \(\sum\limits_d|n^n\mu(d)=[n==1]\)
证明:
将\(n\)分解质因数得\(n=p_1^y_1*p_2^y_2*...*p_k^y_k\)。任何一个质数的个数超过\(1\)时莫比乌斯函数值一定为\(0\),可以不管。我们只需要考虑有多少个质因数的质因数指数都为\(1\)。因此以上式子可以化为\[\sum\limits_i=0^kC^i_k*(-1)^i\]
利用二项式定理得\[\sum\limits_i=0^k\binomki(-1)^i1^k-i=[(-1)+1]^k=0\]
[ 性质 2 ] \(\mu\)函数为积性函数:\(\mu(m*n)=\mu(m)*\mu(n)\) 其中\((m,n)=1\)
证明:
统统分类讨论即可。
设\(m=p_1^x_1*p_2^x_2*...*p_k^x_k\),\(n=q_1^y_1*q_2^y_2*...*q_t^y_t\)
则\(m*n=p_1^x_1*p_2^x_2*...*p_k^x_k*q_1^y_1*q_2^y_2*...*q_t^y_t\)
当\(\mu(m)=0或\mu(n)=0\)时,一定存在一个\(i\)满足\(x_i>1\)或\(y_i>1\),因此\(\mu(m*n)=0\)成立
当\(\mu(m),\mu(n)\)同号时,\(k,t\)奇偶性相同,则\(k+t\)为偶数,因此\(\mu(m*n)=1\)成立
当\(\mu(m),\mu(n)\)异号时,\(k,t\)奇偶性不同,则\(k+t\)为奇数,因此\(\mu(m*n)=-1\)成立
这几条都非常显然吧,还是非常容易证的
线性求莫比乌斯函数
莫比乌斯函数的线性求法依赖于线性筛素数(欧拉筛)。
其本质很简单,对于任何一个素数\(p\)一定满足\(\mu(p)=-1\)。
然后如果存在重复的素因子了,即\(i \% prime[j] = 0\)时,\(\mu\)一定为0. 对于其他情况,相当于在\(i\)的基础上又乘上了一个新的质因子\(prime[j]\),此时就应当乘上\(-1\)
inline void getMobius()
mu[1] = 1; //\mu函数的1是特殊情况
for(int i = 2; i <= 1e6; ++i)
if(!b[i])
prime[++tot] = i;
mu[i] = -1; //质数的\mu值一定为-1
for(int j = 1; j <= tot; ++j)
if(i * prime[j] > 1e6) break;
b[i * prime[j]] = 1;
if(i % prime[j] == 0)
mu[i * prime[j]] = 0;//i中已经包括了prime[j]
break;
else
mu[i * prime[j]] = -mu[i];//不能整除,意味着i中原没有prime[j]这个素因子
莫比乌斯反演
莫比乌斯函数就是用来解决反演的问题的。
[ 公式 1 ]:\[F(n)=\sum\limits_d|nf(d) \xrightarrow[]反演 f(n)=\sum\limits_d|n\mu(d)F(\dfracnd)\]
[ 证明 ] :
恒等式变形得\[\sum\limits_d|n\mu(d)F(\dfracnd)\]
\[=\sum\limits_d|n\mu(d)\sum\limits_i|\fracndf(i)\]
\[=\sum\limits_d|nf(d) \ [\dfracnd==1]=f(n)\]
[ 公式 2 ]:\[F(n)=\sum\limits_n|df(d) \xrightarrow[]反演 f(n)=\sum\limits_n|d\mu(\dfracdn)F(d)\]
[ 证明 ] :
道理类似。令\(k=\dfracdn\),得\[\sum\limits_n|d\mu(\dfracdn)F(d)\]
\[=\sum\limits_k=1^+\infty\mu(k)F(nk)\]
\[=\sum\limits_k=1^+\infty\mu(k)\sum\limits_nk|tf(t)\]
\[=\sum\limits_n|tf(t)[\dfractn==1]=f(n)\]
问题一
求\[\sum\limits_i=1^A\sum\limits_j=1^B[gcd(i,j)==k]\]
解:
设\[f(x)=\sum\limits_i=1^A\sum\limits_j=1^B[gcd(i,j)==x]\]
显然\(f(k)\)即为答案。
构造\[F(x)=\sum\limits_x|df(d)\]
有\[F(x)=\sum\limits_x|d\sum\limits_i=1^A\sum\limits_j=1^B[gcd(i,j)==d]\]\[=\sum\limits_i=1^A\sum\limits_j=1^B[x|gcd(i,j)]\]
由反演得\[f(x)=\sum\limits_x|d\mu(\dfracdx)F(d)\]
则答案为\[f(k)=\sum\limits_k|d\mu(\dfracdk)F(k)\]
考虑\(F(x)\)的意义,是所有数对中\(x\)的倍数的个数。可以推出\(F(x)=\left \lfloor \dfracAx \right \rfloor \cdot \left \lfloor \dfracBx \right \rfloor\)
由此\[f(k)=\sum\limits_k|d\mu(\dfracdk)\left \lfloor \dfracAk \right \rfloor \cdot \left \lfloor \dfracBk \right \rfloor\] \[f(k)=\sum\limits_i\mu(i)\left \lfloor \dfracAk \right \rfloor \cdot \left \lfloor \dfracBk \right \rfloor\]
所谓整除分块,就是用一种方法在\(O(\sqrtn)\)的复杂度内求出\[\sum\limits_i=1^n\left \lfloor \dfracni \right \rfloor\]我们发现当\(i\)接近时,有可能有很多重复的值。整除分块的思想就是将所有重复的数值一起计算。
可以证明总共有不超过\(2\sqrtn\)个取值。也可以证明值为\(i\)的最后一个分母是第\(N\) / \((N\)/\(i)\)个。因此只需要每次取一段区间,然后将指针跳到下一个区间即可
回看莫比乌斯反演。假如我们得出了形如这样的反演式子\[f(n)=\sum\limits_n|d^Min(A,B)\mu(\dfracdn)\left \lfloor \dfracAn \right \rfloor * \left \lfloor \dfracBn \right \rfloor\]现在有两个整除的式子了,如何利用整除分块进行优化?
那么依然利用单个整除式的思想。每一个块要求\(\left \lfloor \dfracAn \right \rfloor\)和\(\left \lfloor \dfracBn \right \rfloor\)都相同。因此我们每次应当跳到单独的区间靠前的那个,这样才能满足两者数值相同
现在唯一的问题就是处理\(\mu\)了,\(\mu\)的值不是连续的,如果能够通过一种方法将\(\mu\)转化为一个类似前缀和的东西,就可以直接计算了。
对该式进行恒等变换。令\(k=\dfracdn\):\[\sum\limits_n|d\mu(k)\left \lfloor \dfracAnk \right \rfloor * \left \lfloor \dfracBnk \right \rfloor\]其实\(k\)的意义就是\(d\)为\(n\)的几倍,因此不再需要枚举\(d\),直接枚举\(k\)即可,范围是\(nk \leq Min(A,B)\)。不妨将\(A,B\)都除上\(n\)。即\(A'=\dfracAn,B'=\dfracBn\):\[\sum\limits_k=1\mu(k)\left \lfloor \dfracA'k \right \rfloor * \left \lfloor \dfracB'k \right \rfloor\]
至此,\(\mu\)已经和除式同步。因此只需要预处理\(\mu\)的前缀和即可
以上是关于「莫比乌斯反演」的主要内容,如果未能解决你的问题,请参考以下文章