• 莫比乌斯函数


    一、前导

    要学习莫比乌斯函数 需要学习 到 积性函数,深度理解欧拉筛
    先说说什么是积性函数吧。

    二、积性函数

    其实积性函数非常好理解

    1. 定义

    积性函数:若\(gcd(a,b)=1\),且满足\(f(ab)=f(a)f(b)\),则称\(f(x)\)积性函数

    完全积性函数:对于任意正整数\(a,b\),都满足\(f(ab)=f(a)f(b)\),则称\(f(x)\)完全积性函数

    2. 性质

    1.若\(f(n),g(n)\)均为积性函数,则函数\(h(n)=f(n)g(n)\)也是积性函数

    2.若\(f(n)\)为积性函数,则函数\(c*f(n)\)(\(c\)是常数)也是积性函数,反之一样

    3.任何积性函数都能应用线性筛,在\(O(n)\)时间内求出\(1\sim n\)项(莫比乌斯就要用到),像素数,欧拉函数等都是 积性函数

    知道这些之后,我们就来看莫比乌斯函数。

    三、莫比乌斯函数

    1. 定义

    莫比乌斯函数主要是个分段函数。

    \[\large \mu(n)= \large \left\{\begin{matrix} 1 && 若n=1 \\ (-1)^k && 若n无平方数和因数,且n=p_1p_2p_3...p_k \\ 0 && 若n有大于1的平方数 \end{matrix}\right. \]

    \(μ(n)\) ——莫比乌斯函数,是关于非平方数的质因子数目
    • \(n=1,μ(n) =1\)

    • \(n\)存在有大于\(1\)方数因数(如\(4\)(\(2\)平方),\(9\)(\(3\)的平方),\(27\)(\(3\)的立方),则\(μ(n) =0\)

    • 否则\(μ(n)\) 的结果取决于\(n\)根据算数基本定理分解的质因数个数的奇偶性来判断。比如\(n=3,5,7\)就只有一个质因数所以为\(μ(n)=-1\)\(n=6,15,21\)\(μ(n)\)就为\(1\)

    2. 求单个数字的莫比乌斯函数值

    //单个数的莫比乌斯函数
    int getmob(LL x) {
        int sum = 0;
        for (LL i = 2; i <= x / i; i++) { //从2开始,一直到 sqrt(x),枚举所有可能存的小因子
            int cnt = 0;
            if (x % i == 0) {                     //如果x可以整除i
                while (x % i == 0) cnt++, x /= i; //计数,并且不断除掉这个i因子
                if (cnt > 1) return 0;            //如果某个因子,存在两个及以上个,则返回0
                sum++;                            //记录因子个数
            }
        }
        if (x != 1) sum++;         //如果还存在另一个大因子,那么因子个数+1
        return (sum & 1) ? -1 : 1; //奇数个因子,返回-1,否则返回1
    }
    

    3.莫比乌斯有两种反演形式

    \[\large \displaystyle F(n)=\sum_{d|n}f(d) \Leftrightarrow f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) \]

    \[\large F(n)=\sum_{n|d}f(d) \Leftrightarrow f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) \]

    4.枚举倍数求莫比乌斯函数

    //枚举倍数求莫比乌斯函数
    LL mu[N] , sum[N];
    void mobius(LL x) {
        mu[1] = 1;
        for (LL i = 1; i <= x; i++)
            for (LL j = i + i; j <= x; j += i)
                mu[j] -= mu[i];
        // 维护u(x)前缀和
        for (LL i = 1; i <= n; i++) sum[i] = sum[i - 1] + mu[i];
    }
    

    5.枚举约数求莫比乌斯函数

    //筛法求莫比乌斯函数(枚举约数)
    LL mu[N] , sum[N];
    int primes[N], cnt;
    bool st[N];
    void get_mobius2(LL n) {
        mu[1] = 1;
        for (LL i = 2; i <= n; i++) {
            if (!st[i]) {
                primes[cnt++] = i;
                mu[i] = -1;
            }
            for (LL j = 0; primes[j] <= n / i; j++) {
                LL t = primes[j] * i;
                st[t] = true;
                if (i % primes[j] == 0) {
                    mu[t] = 0;
                    break;
                }
                mu[t] = mu[i] * -1;
            }
        }
         // 维护u(x)前缀和
        for (LL i = 1; i <= n; i++) sum[i] = sum[i - 1] + mu[i];
    }
    

    四、练习题

    我们举例一道经典的应用题,求\(1\)\(N\)中与\(a\)互质的数的个数:那么根据容斥原理,设\(S_i\)\(1\)\(N\)中和\(a\)有公因子\(i\)的数的个数,答案为\(N−S_2-S_3-S_5-S_7...+S_{2,3}+S_{3,5}+S_{2,5}...\),我们可以惊奇的发现,其答案为\(\large \displaystyle \sum_{i=1}^{N}\mu(i)*S_i\)

    我们可以根据线性筛质数在\(O(N)\)的时间内算出前\(N\)个数的莫比乌斯函数。

  • 相关阅读:
    软件补丁问题(网络流24题)
    飞行员配对方案问题(网络流24题)
    [NOIp普及组2011]瑞士轮
    如何在Linux上安装QQ
    [洛谷P2420] 让我们异或吧
    高斯消元
    [SCOI2014]方伯伯的OJ
    [USACO1.3]虫洞
    KMP算法讲解
    [洛谷P1382] 楼房
  • 原文地址:https://www.cnblogs.com/littlehb/p/16392135.html
Copyright © 2020-2023  润新知