莫比乌斯反演学习笔记

莫比乌斯反演学习笔记

前置知识

整除分块(数论分块)

整除分块,主要是用来处理类似以下问题的:

\[\sum_{i = 1} ^ n \left \lfloor \frac{n}{i} \right \rfloor \]

当然可以选择暴力枚举计算,但这只适用于 \(n \le 10^8\),再大就会超时了。

那如果 \(n > 10^8\) 有没有计算方法怎么办呢?这时候就需要使用整除分块了。

首先使用暴力打个表来观察规律,假设 \(n = 20\),对于 \(i \le 20\) 的答案为:

$i = $ \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\) \(10\)
$ans = $ \(20\) \(10\) \(6\) \(5\) \(4\) \(3\) \(2\) \(2\) \(2\) \(2\)
$i = $ \(11\) \(12\) \(13\) \(14\) \(15\) \(16\) \(17\) \(18\) \(19\) \(20\)
$ans = $ \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\)

可以很明显的发现在一些区间内,答案都是一样的。

所以可以计算出每个答案对应的 \(i\) 的最大值以及最小值即可。

最小值直接枚举,假设其为 \(l\),那么该区间的答案就是 \(\left \lfloor \frac{n}{l} \right \rfloor\),假设最大值为 \(r, r = \max(i), r = \left \lfloor \frac{n}{k} \right \rfloor = \left \lfloor \frac{n}{\frac{n}{l}} \right \rfloor\),这个区间的总贡献为 \(k \times (r - l + 1)\)

来看一道题:P2261 [CQOI2007] 余数求和

\(\sum_{i = 1} ^ n k \mod i\)

\[\sum_{i = 1} ^ n k \mod i\\ = \sum_{i = 1} ^ n k - \left \lfloor \frac{k}{i} \right \rfloor \times i\\ = n \times k - \sum_{i = 1} ^ n \left \lfloor \frac{k}{i} \right \rfloor \times i \]

可以使用整除分块进行解决,注意一下有可能 \(k \le n\) 要特判下边界。

留一道练习题(我也还没过):P2260 [清华集训2012] 模积和

相关定义及概念

狄利克雷卷积

首先需要知道什么叫做卷积呢?其实说人话卷积就是多项式乘法。

对于两个生成函数 \(f(x)\)\(g(x)\),记它们的狄利克雷卷积为 \(h(x)\)

\[h(x) = \sum_{d | x} f(d)g(\frac{x}{d}) = \sum_{ab = x} f(a)g(b) \]

积性函数

如果 \(\forall a,b\)\(\gcd(a, b) == 1\)\(f(ab) = f(a)f(b)\),则称 \(f\) 函数为积性函数。

完全积性函数

如果 \(\forall a,b\)\(f(ab) = f(a)f(b)\),则称 \(f\) 函数为完全积性函数。

与积性函数的区别在于没有 \(\gcd(a, b) == 1\) 的条件了。

单位元

对于一个运算,其单位元为在某个数与单位元进行操作过后依然是原数。

举个例子,加法运算的单位元是 \(0\),乘法运算的单位元是 \(1\)

习惯于将记为 \(e\) 或者 \(\varepsilon\)

而单位元在卷积运算中 \(e = [n == 1]\)

欧拉函数

先不要管为什么将莫比乌斯会提到欧拉函数,后面莫比乌斯的有个性质和欧拉函数有关。

定义

\(\phi\) 为欧拉函数,定义为:

\[\phi(n) = \sum_{i = 1} ^ {n} [\gcd(i, n) == 1] \]

计算

怎么快速计算,对于 \(\phi\) 的计算,有如下公式:

\[n = p_1 ^ {c_1} \cdot p_2 ^ {c_2} \cdot p_3 ^ {c_3} … p_{k - 1} ^ {c_{k - 1}} \cdot p_k ^ {c_k}\\ \phi(n) = n \cdot \prod _ {i = 1} ^ k (1 - \frac{1}{p_k})\\ \]

怎么证明呢,这里需要一点小小的容斥:

这里为了方便表示,除法,分数默认向下取整。

  1. 先去掉 \(n\)\(p_1, p_2, p_3 … p_{k - 1}, p_k\) 的倍数:

    \[n - \frac{n}{p_1} - \frac{n}{p_2} - \frac{n}{p_3} - … - \frac{n}{p_{k - 1}} - \frac{n}{p_k} \]

  2. 对于即使 \(p_1\) 的倍数,又是 \(p_2\) 的倍数的就会被多算,所以加回来:

    \[n + \frac{n}{p_1 p_2} + \frac{n}{p_1 p_3} + \frac{n}{p_1 p_4} + … + \frac{n}{p_{k - 1} p_k} \]

  3. 重复此步骤直到为分母为 \(q_1\)\(q_k\) 的乘积。

这个的和就是上述的计算公示了。

性质及结论

知道计算公示后,还需要知道一些关于 \(\phi\) 的性质:

  1. 如果 \(x \in prime\)\(\phi(x) = x - 1\)

  2. 欧拉函数是一个积性函数,但又不是完全积性函数,所以如果 \([\gcd(i, j) == 1]\)\(\phi(ij) = \phi(i) \phi(j)\)

  3. \(\phi * 1 = id\),这里的 \(*\) 是狄利克雷卷积,这个性质在推式子以及杜教筛都会用到。

  4. \(id * \mu = \phi\),同样的,这里的 \(*\) 为狄利克雷卷积。

  5. 欧拉函数也有欧拉反演,形式如下:

    \[n = \sum_{d | n} \phi(d) \]

  6. 给一个常用的式子,避免到时候还要去推:

    \[\sum_{i = 1} ^ {n} \sum_{j = 1} ^ {n} \gcd(i, j)\\ = \sum_{D = 1} ^ {n} \phi(D) \times \left \lfloor \frac{n}{D} \right \rfloor\left \lfloor \frac{n}{D} \right \rfloor \\ \]

    剩下的部分整除分块加一个 \(\phi\) 的前缀和即可。

代码实现

如果落实到代码中,上述公式就显得过于笨重且麻烦了。所以,落实在程序在程序中就要使用筛法以及性质进行优化。

具体如下:

void Phi(){
	phi[1] = 1;
	for(int i = 2 ; i <= Maxn ; i++){
		if(!vis[i]){
			prime[++tot] = i;
			phi[i] = i - 1;\\性质 1
		}
		for(int j = 1 ; j <= tot && prime[j] * i <= Maxn ; j++){
			vis[i * prime[j]] = 1;
			if(i % prime[j] == 0){
				phi[i * prime[j]] = phi[i] * prime[j];
                \\i * prime[j] 只比 i 多了一个质因数 prime[j],又因为 i % prime[j] == 0,所以与 i 互质的一定与 
                  i * prime[j] 互质。i * prime[j] 比 i 多互质的只有与 i 互质的倍数而已,所以是 phi[i] * 	                       prime[j]。
			}
			phi[i * prime[j]] = phi[i] * (prime[j] - 1);
            \\ i,prime[j] 互质,根据性质 2 可得。
		}
	}
}

莫比乌斯函数

既然要学莫比乌斯反演,肯定要知道莫比乌斯函数。

定义

\(\mu\) 为莫比乌斯函数,定义为:

\[\mu(n) = \begin{cases} 1 &(n = 1)\\ 0 &(n 有平方因子) \\ (-1) ^ k &(k 为 n 的本质不同质因子个数) \\ \end{cases} \]

性质及结论

关于莫比乌斯函数有几个好玩的性质:

  1. 与单位元的关系:

    \[\sum_{d | n} \mu(d) = [n == 1] = e(n)\\ 也可以写做\\ \sum_{d | n} \mu(d) = \begin{cases} 1 & (n = 1)\\ 0 & (n > 1) \\ \end{cases} \]

    证明:

    1. \([n == 1]\) 时,\(d = 1\)\(\mu(d)\) 只能等于 \(1\),成立。

    2. \(n \ne 1\) 时:

      可以不用管 \(\mu(d) = 0\) 的情况,只需要考虑 \(\mu(d) \ne 0\) 的情况,也就是 \(d\) 每个质因子的指数 \(\le 1\)

      假设:

      \[n = p_1 ^ {c_1} \cdot p_2 ^ {c_2} \cdot p_3 ^ {c_3} … p_{k - 1} ^ {c_{k - 1}} \cdot p_k ^ {c_k}\\ \]

      由于质因子幂大于 \(1\)\(\mu\) 值为 \(0\),所以因此只考虑质因子幂为 \(0, 1\) 的情况:

      \[\sum_{d | n} \mu(d) = \sum_{i = 0} ^ k C_k ^ i \times (-1) ^ i\\ = \sum_{i = 0} ^ k C_k ^ i \times (-1) ^ i \times 1 ^ {k - i}\\ 根据二项式定理:(x + y) ^ n = \sum_{i = 0} ^ n C_n ^ i x ^ {n - k} \times y ^ k 得\\ 原式 = (1 - 1) ^ k = 1 \]

  2. 与欧拉函数的关系(我蒟蒻,所以不证明了,上面也提到过)

    \[id * \mu = \phi (这第的 * 是狄利克雷卷积) \]

代码实现

很好想的啦,根据上面的对与莫比乌斯函数的性质可以很容易的筛出来:

void Mu(){
    mu[1] = 1;
    for(int i = 2 ; i <= Maxn ; i++){
        if(!vis[i]){
            prime[++tot] = i;
            mu[i] = -1; //质数,所以只有一个质因子,所以初值为 -1
        }
        for(int j = 1 ; j <= tot && prime[j] * i <= Maxn ; j++){
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break; //prime[j] * i 中质因子 prime[j] 出现了两次及以上,所以为零不管
            mu[prime[j] * i] = -mu[i];//多一个质因子,取相反数
        }
    }
}

莫比乌斯反演

终于进入正题了。

定理

对于一些函数 \(f(n)\),如果我们很难直接求出它的值,而容易求出倍数和或约数和 \(F(n)\),那么我们可以通过莫比乌斯反演来求得 \(f(n)\) 的值。

形式化的说:

\[如果满足 F(n) = \sum_{d | n} f(d)\\ 那么 f(n) = \sum_{d | n} \mu(d) F(\left \lfloor \frac{n}{d} \right \rfloor) \]

由于我是蒟蒻,所以我这里就不证明了,能用即可。

相关习题

说在前面,我懒得搬运了,放在这里的题都是我做过的,在隔壁的做题记录中是可以找到题解的应该吧

P1390 公约数的和

P1447 [NOI2010] 能量采集

P2257 YY的GCD

P2522 [HAOI2011] Problem b

P3172 [CQOI2015] 选数

P3327 [SDOI2015] 约数个数和

P3768 简单的数学题

P3911 最小公倍数之和

posted @ 2023-11-24 17:25  Populus_euphratica  阅读(17)  评论(0)    收藏  举报