《莫比乌斯反演》

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

首先,要先介绍一下莫比乌斯函数$mu $。

其实莫比乌斯函数就是一个分段函数:

$mu (d) = egin{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在求解的时候肯定是有范围的(即题目给定的范围)。

原文地址:https://www.cnblogs.com/zwjzwj/p/13796182.html