zoukankan      html  css  js  c++  java
  • 《莫比乌斯反演》

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

    首先,要先介绍一下莫比乌斯函数$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在求解的时候肯定是有范围的(即题目给定的范围)。

  • 相关阅读:
    Leetcode 第135场周赛解题报告
    程序员如何当好面试者
    程序员如何当好面试官
    Leetcode 第133场周赛解题报告
    如何高效工作——团队篇
    程序员如何高效工作——个人软件篇
    程序员如何高效工作——个人硬件篇
    HTTP协议:从原理到流程|乐字节
    Tomcat详解|乐字节
    说说Java Web中的Web应用程序|乐字节
  • 原文地址:https://www.cnblogs.com/zwjzwj/p/13796182.html
Copyright © 2011-2022 走看看