莫比乌斯反演学习笔记
莫比乌斯反演学习笔记
前置知识
整除分块(数论分块)
整除分块,主要是用来处理类似以下问题的:
当然可以选择暴力枚举计算,但这只适用于 \(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\)。
可以使用整除分块进行解决,注意一下有可能 \(k \le n\) 要特判下边界。
留一道练习题(我也还没过):P2260 [清华集训2012] 模积和。
相关定义及概念
狄利克雷卷积
首先需要知道什么叫做卷积呢?其实说人话卷积就是多项式乘法。
对于两个生成函数 \(f(x)\) 和 \(g(x)\),记它们的狄利克雷卷积为 \(h(x)\)。
积性函数
如果 \(\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\) 中 \(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} \] -
对于即使 \(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} \] -
重复此步骤直到为分母为 \(q_1\) 到 \(q_k\) 的乘积。
这个的和就是上述的计算公示了。
性质及结论
知道计算公示后,还需要知道一些关于 \(\phi\) 的性质:
-
如果 \(x \in prime\),\(\phi(x) = x - 1\)
-
欧拉函数是一个积性函数,但又不是完全积性函数,所以如果 \([\gcd(i, j) == 1]\),\(\phi(ij) = \phi(i) \phi(j)\)
-
\(\phi * 1 = id\),这里的 \(*\) 是狄利克雷卷积,这个性质在推式子以及杜教筛都会用到。
-
\(id * \mu = \phi\),同样的,这里的 \(*\) 为狄利克雷卷积。
-
欧拉函数也有欧拉反演,形式如下:
\[n = \sum_{d | n} \phi(d) \] -
给一个常用的式子,避免到时候还要去推:
\[\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\) 为莫比乌斯函数,定义为:
性质及结论
关于莫比乌斯函数有几个好玩的性质:
-
与单位元的关系:
\[\sum_{d | n} \mu(d) = [n == 1] = e(n)\\ 也可以写做\\ \sum_{d | n} \mu(d) = \begin{cases} 1 & (n = 1)\\ 0 & (n > 1) \\ \end{cases} \]证明:
-
当 \([n == 1]\) 时,\(d = 1\),\(\mu(d)\) 只能等于 \(1\),成立。
-
当 \(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 \]
-
-
与欧拉函数的关系(我蒟蒻,所以不证明了,上面也提到过)
\[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)\) 的值。
形式化的说:
由于我是蒟蒻,所以我这里就不证明了,能用即可。
相关习题
说在前面,我懒得搬运了,放在这里的题都是我做过的,在隔壁的做题记录中是可以找到题解的应该吧。

浙公网安备 33010602011771号