莫比乌斯反演
目录
莫比乌斯反演是数论中的重要内容。对于一些函数 ,如果很难直接求出它的值,而容易求出其倍数和或约数和 ,那么可以通过莫比乌斯反演简化运算,求得函数的值。
前置知识
整除定理
⌊ a b c ⌋ = ⌊ a b c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \lfloor \frac{a}{bc} \rfloor = \lfloor \frac{a}{bc} \rfloor = \lfloor \frac{\lfloor \frac{a}{b} \rfloor}{c} \rfloor ⌊bca⌋=⌊bca⌋=⌊c⌊ba⌋⌋
商定理
∀ n ∈ N + , ∣ { ⌊ n d ⌋ ∣ d ∈ N + , d ≤ n } ∣ ≤ ⌊ 2 n ⌋ \forall n \in \mathbb{N}_{+}, \left|\left\{ \lfloor \frac{n}{d} \rfloor \mid d \in \mathbb{N}_{+},d\leq n \right\}\right| \leq \lfloor 2\sqrt{n} \rfloor ∀n∈N+,∣∣∣{⌊dn⌋∣d∈N+,d≤n}∣∣∣≤⌊2n⌋
数论分块
考虑求和式 ∑ i = 1 m ⌊ k i ⌋ \sum_{i=1}^{m} \lfloor \frac{k}{i} \rfloor ∑i=1m⌊ik⌋,其中 m m m和 k k k均为已知常数。
我们发现, i i i在一定的范围内 ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋的值相等,因此整个 ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋将会分成几个相等的块,加快计算速度。
即,对于任意的 i i i,我们需要找到最大的 j j j,并且 m ≥ j ≥ i m \geq j \geq i m≥j≥i, ⌊ k i ⌋ = ⌊ k j ⌋ \lfloor \frac{k}{i} \rfloor =\lfloor \frac{k}{j} \rfloor ⌊ik⌋=⌊jk⌋。
给出结论: j = ⌊ k ⌊ k i ⌋ ⌋ j = \lfloor \frac{k}{\lfloor \frac{k}{i} \rfloor} \rfloor j=⌊⌊ik⌋k⌋
利用上述结论,我们可以进行分块 [ i , j ] [i,j] [i,j]求和。
a n s = ∑ i = 1 n ( k m o d i ) = ∑ i = 1 n k − i ⌊ k i ⌋ ans=\sum_{i=1}^n(k\bmod i)=\sum_{i=1}^nk-i\left\lfloor\frac{k}{i}\right\rfloor ans=i=1∑n(kmodi)=i=1∑nk−i⌊ik⌋
这样就可以利用整除分块去做了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FR freopen("in.txt", "r", stdin)
#define FW freopen("out.txt", "w", stdout)
int main()
{
ll n, k;
scanf("%lld %lld", &n, &k);
ll ans = n * k;
for (ll l = 1, r; l <= n; l = r + 1)
{
// 寻找 r
if (k / l == 0)
{
r = n;
}
else
{
r = min(n, k / (k / l));
}
ll t = (k / l) * (l + r) * (r - l + 1) / 2;
ans -= t;
}
printf("%lld", ans);
return 0;
}
积性函数和狄利克雷卷积
参考我的狄利克雷卷积文章。
莫比乌斯函数
μ \mu μ为莫比乌斯函数,定义为:
μ ( n ) = { 1 n = 1 0 n 含有平方及以上因子 ( − 1 ) k k 为 n 的本质不同质因子个数 \mu(n)= \begin{cases} 1&n=1\\ 0&n\text{ 含有平方及以上因子}\\ (-1)^k&k\text{ 为 }n\text{ 的本质不同质因子个数}\\ \end{cases} μ(n)=⎩⎪⎨⎪⎧10(−1)kn=1n 含有平方及以上因子k 为 n 的本质不同质因子个数
其中令 k = ω ( n ) k=\omega(n) k=ω(n), ω ( n ) \omega(n) ω(n)为加性函数。
并且:
μ ∗ 1 = ε \mu\ast 1=\varepsilon μ∗1=ε
这表明, μ \mu μ是 1 1 1的狄利克雷卷积的逆元。
莫比乌斯函数的求法
如何求 μ \mu μ函数呢,利用线性筛和积性函数的性质,可以参考我的筛法的文章。
莫比乌斯函数与欧拉函数的关系
我们在之前已经证明 φ ∗ 1 = I d \varphi \ast 1=Id φ∗1=Id,对两边做 μ \mu μ的卷积得到:
φ ( n ) = ∑ d ∣ n d ∗ μ ( n d ) \varphi(n)=\sum_{d \mid n} d * \mu(\frac{n}{d}) φ(n)=d∣n∑d∗μ(dn)
莫比乌斯反演
已知函数 f = g ∗ 1 f = g \ast 1 f=g∗1,我们现在要求解 g g g函数的表达值,将两边对 μ \mu μ做卷积,得到:
f ∗ μ = g f \ast \mu = g f∗μ=g
这就是莫比乌斯反演。
具体写成和积式为:
如果有 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d\mid n}g(d) f(n)=∑d∣ng(d),那么有 g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) g(n)=\sum_{d\mid n}\mu(d)f(\frac{n}{d}) g(n)=∑d∣nμ(d)f(dn)。
如果有 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d\mid n}g(d) f(n)=∑d∣ng(d),那么有 g ( n ) = ∑ d ∣ n μ ( n d ) f ( d ) g(n)=\sum_{d\mid n}\mu(\frac{n}{d})f(d) g(n)=∑d∣nμ(dn)f(d)。
例题
类型一:利用 φ ∗ 1 = I d \varphi \ast 1=Id φ∗1=Id反向枚举 d d d
答案求:
∑ p ∈ p r i m e s ∑ i N ∑ j M [ gcd ( i , j ) = p ] \sum_{p \in primes} \sum_i^N \sum_j^M [\gcd(i,j)=p] p∈primes∑i∑Nj∑M[gcd(i,j)=p]
对gcd进行套路除法:
∑ p ∈ p r i m e s ∑ i ⌊ N p ⌋ ∑ j ⌊ M p ⌋ [ gcd ( i , j ) = 1 ] \sum_{p \in primes} \sum_i^{\lfloor \frac{N}{p} \rfloor} \sum_j^{\lfloor \frac{M}{p} \rfloor} [\gcd(i,j)=1] p∈primes∑i∑⌊pN⌋j∑⌊pM⌋[gcd(i,j)=1]
我们知道 μ ∗ 1 = ε \mu \ast 1 = \varepsilon μ∗1=ε,因此 ∑ d ∣ x μ ( d ) = [ x = 1 ] \sum_{d \mid x} \mu(d) = [x = 1] ∑d∣xμ(d)=[x=1],带入gcd,得到:
∑ d ∣ g c d ( i , j ) μ ( d ) = [ gcd ( i , j ) = 1 ] \sum_{d \mid gcd(i,j)} \mu(d) = [\gcd(i,j) = 1] d∣gcd(i,j)∑μ(d)=[gcd(i,j)=1]
这是莫比乌斯反演很经典的套路代换,带入到上式中:
∑ p ∈ p r i m e s ∑ i ⌊ N p ⌋ ∑ j ⌊ M p ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{p \in primes} \sum_i^{\lfloor \frac{N}{p} \rfloor} \sum_j^{\lfloor \frac{M}{p} \rfloor} \sum_{d \mid \gcd(i,j)} \mu(d) p∈primes∑i∑⌊pN⌋j∑⌊pM⌋d∣gcd(i,j)∑μ(d)
求和太多了,我们改变一下求和次序,我们枚举 d d d,从而带入 i , j i,j i,j,也就是说如果 d ∣ gcd ( i , j ) d \mid \gcd(i,j) d∣gcd(i,j)等价于 d ∣ i ∧ d ∣ j d \mid i \wedge d \mid j d∣i∧d∣j,这也是是数论常见的处理套路,即为:
∑ p ∈ p r i m e s ∑ d = 1 min ( ⌊ N p ⌋ , ⌊ M p ⌋ ) ⌊ N p d ⌋ × ⌊ M p d ⌋ × μ ( d ) \sum_{p \in primes} \sum_{d=1}^{\min({\lfloor \frac{N}{p} \rfloor},{\lfloor \frac{M}{p} \rfloor})} {\lfloor \frac{N}{pd} \rfloor} \times {\lfloor \frac{M}{pd} \rfloor} \times \mu(d) p∈primes∑d=1∑min(⌊pN⌋,⌊pM⌋)⌊pdN⌋×⌊pdM⌋×μ(d)
此时我们可以枚举 p , d p,d p,d进行计算,此时复杂度是 O ( n 2 ) O(n^2) O(n2)的,我们这次枚举 p d pd pd,即令 T = p d T=pd T=pd:
∑ T = 1 min ( N , M ) ⌊ N T ⌋ × ⌊ M T ⌋ ∑ p ∣ T μ ( T p ) \sum_{T = 1}^{\min(N,M)} \lfloor \frac{N}{T} \rfloor \times \lfloor \frac{M}{T} \rfloor \sum_{p \mid T} \mu(\frac{T}{p}) T=1∑min(N,M)⌊TN⌋×⌊TM⌋p∣T∑μ(pT)
考虑后面的莫比乌斯函数的部分,可以通过元素贡献计算此函数,因为是枚举的是倍数,时间复杂度是调和级的,大概为 O ( N log N ) O(N \log N) O(NlogN),前面枚举 T T T可以用二维整除分块来做,总时间复杂度为 O ( T ( N + N log N ) ) O(T(\sqrt{N} + N \log N)) O(T(N+NlogN))。
跟上一题的思路一致,只不过多了一步容斥,假设设 f ( n , m ) = ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] f(n,m) = \sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j) = k] f(n,m)=∑i=1n∑j=1m[gcd(i,j)=k],那么所求为: f ( b , d ) − f ( a − 1 , d ) − f ( b , c − 1 ) + f ( a − 1 , c − 1 ) f(b,d) - f(a-1,d) - f(b,c-1) + f(a-1,c-1) f(b,d)−f(a−1,d)−f(b,c−1)+f(a−1,c−1)。
同样的套路,反向枚举 d d d,做背包即可。
同样的套路,反向枚举 d d d,注意此题莫比乌斯函数前缀和范围较大,需要用杜教筛等高级筛法求莫比乌斯函数的前缀和。
求两个数乘积约数个数,有公式:
d ( i j ) = ∑ x ∣ i ∑ y ∣ i [ gcd ( x , y ) = 1 ] d(ij) = \sum_{x \mid i}\sum_{y \mid i} [\gcd(x,y) = 1] d(ij)=x∣i∑y∣i∑[gcd(x,y)=1]
证明:
考虑 i j ij ij的一个因子 K K K, K K K中存在质数因子 p c p^c pc, i i i存在质数因子 p a p^a pa, j j j存在质数因子 p b p^b pb。如果 c ≤ a c \leq a c≤a,那么在 i i i中选择 c c c,如果 c > a c \gt a c>a,那么在 b b b中选择 c − a c - a c−a。我们发现对于同一质数的选择,不能在 i i i和 j j j中选择同一质数,因此 x x x和 y y y互质。
有了这个公式之后,对这个式子进行莫反即可。
看见对 gcd ( i , j ) \gcd(i,j) gcd(i,j)计数,应枚举 d = gcd d = \gcd d=gcd,从而构造出 [ gcd ( i , 1 ) = 1 ] [\gcd(i,1) = 1] [gcd(i,1)=1]。