莫比乌斯反演

莫比乌斯反演

莫比乌斯反演是数论中的重要内容。对于一些函数 ,如果很难直接求出它的值,而容易求出其倍数和或约数和 ,那么可以通过莫比乌斯反演简化运算,求得函数的值。

前置知识

整除定理

⌊ 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=cba

商定理

∀ 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 nN+,{dndN+,dn}2n

数论分块

考虑求和式 ∑ i = 1 m ⌊ k i ⌋ \sum_{i=1}^{m} \lfloor \frac{k}{i} \rfloor i=1mik,其中 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 mji ⌊ 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=ikk

利用上述结论,我们可以进行分块 [ i , j ] [i,j] [i,j]求和。

P2261

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=1n(kmodi)=i=1nkiik

这样就可以利用整除分块去做了。

#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)=dndμ(dn)

莫比乌斯反演

已知函数 f = g ∗ 1 f = g \ast 1 f=g1,我们现在要求解 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)=dng(d),那么有 g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) g(n)=\sum_{d\mid n}\mu(d)f(\frac{n}{d}) g(n)=dnμ(d)f(dn)

如果有 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d\mid n}g(d) f(n)=dng(d),那么有 g ( n ) = ∑ d ∣ n μ ( n d ) f ( d ) g(n)=\sum_{d\mid n}\mu(\frac{n}{d})f(d) g(n)=dnμ(dn)f(d)

例题

类型一:利用 φ ∗ 1 = I d \varphi \ast 1=Id φ1=Id反向枚举 d d d

P2257

答案求:

∑ 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] pprimesiNjM[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] pprimesipNjpM[gcd(i,j)=1]

我们知道 μ ∗ 1 = ε \mu \ast 1 = \varepsilon μ1=ε,因此 ∑ d ∣ x μ ( d ) = [ x = 1 ] \sum_{d \mid x} \mu(d) = [x = 1] dxμ(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] dgcd(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) pprimesipNjpMdgcd(i,j)μ(d)

求和太多了,我们改变一下求和次序,我们枚举 d d d,从而带入 i , j i,j i,j,也就是说如果 d ∣ gcd ⁡ ( i , j ) d \mid \gcd(i,j) dgcd(i,j)等价于 d ∣ i ∧ d ∣ j d \mid i \wedge d \mid j didj,这也是是数论常见的处理套路,即为:

∑ 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) pprimesd=1min(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=1min(N,M)TN×TMpTμ(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))


P2522

跟上一题的思路一致,只不过多了一步容斥,假设设 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=1nj=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(a1,d)f(b,c1)+f(a1,c1)


CF1559E

同样的套路,反向枚举 d d d,做背包即可。


P3172

同样的套路,反向枚举 d d d,注意此题莫比乌斯函数前缀和范围较大,需要用杜教筛等高级筛法求莫比乌斯函数的前缀和。


P3327

求两个数乘积约数个数,有公式:

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)=xiyi[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 ca,那么在 i i i中选择 c c c,如果 c > a c \gt a c>a,那么在 b b b中选择 c − a c - a ca。我们发现对于同一质数的选择,不能在 i i i j j j中选择同一质数,因此 x x x y y y互质。

有了这个公式之后,对这个式子进行莫反即可。


P1829

看见对 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]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值