《莫比乌斯反演》

早就想学了,终于开始填这个坑了~。

首先,要先介绍一下莫比乌斯函数$\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反转
        }
    }
}
View Code

 

接下来就可以引入莫比乌斯的反演。

莫比乌斯反演定理:

对于给定的两个函数: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在求解的时候肯定是有范围的(即题目给定的范围)。

 

posted @ 2020-10-11 08:45  levill  阅读(96)  评论(0编辑  收藏  举报