《莫比乌斯反演》
早就想学了,终于开始填这个坑了~。
首先,要先介绍一下莫比乌斯函数$\mu $。
其实莫比乌斯函数就是一个分段函数:
$\mu (d) = \begin{Bmatrix}
1 & d = 1 & \\
(-1)^{k} && \\
0 & &
\end{Bmatrix}$
当 d = 1,mu = 1.
当 满足d没有平方因数,且$d = \prod_{i = 1}^{k}pi$,且pi全为质数时,$mu = (-1)^{k}$.
可以发现,就是后面这个式子就是将d质因子分解之后,每个质因子的幂次都要为1,这样就没有平方因数,所以可以用后面的连乘表示。
其他情况下,即d 有大于1的平方因数时,mu = 0
对于莫比乌斯函数的求解:我们只需要明白,对于一个素数,它只有一个平方因子(大于1的)即它本身,那么他的mu = (-1)^1 = -1.
然后,我们就可以在线性筛中边筛边处理莫比乌斯函数即可。
int mu[N],prim[N],tot = 0; bool vis[N]; void get_mu() { mu[1] = 1;//d = 1 for(rg int i = 2;i < N;++i) { if(!vis[i]) { prim[++tot] = i; mu[i] = -1; } for(rg int j = 1;j <= tot && prim[j] * i < N;++j) { vis[prim[j] * i] = 1; if(i % prim[j] == 0) break; else mu[i *prim[j]] = -mu[i];//多了一个质因子就反一下,即k + 1,-1反转 } } }
接下来就可以引入莫比乌斯的反演。
莫比乌斯反演定理:
对于给定的两个函数:F[n] 和 f[n].
如果满足$F[n] = \sum_{d | n}^{}f[d]$
那么,就可以反演得到$f[n] = \sum_{d | n}^{} \mu (d)~F[[\frac{n}{d}]]$
这个就是莫比乌斯反演的定理。
莫比乌斯反演形式二:
当满足$F[d] = \sum_{d | n}^{} f[n] $
就可以反演得到:$f[d] = \sum_{d | n}^{}\mu (\frac{n}{d})F[n]$
可以发现,这里的n在求解的时候肯定是有范围的(即题目给定的范围)。