莫比乌斯反演入门解析

Posted decray

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了莫比乌斯反演入门解析相关的知识,希望对你有一定的参考价值。

以下教程前半部分来自B站电子科技大学的视频 https://www.bilibili.com/video/av43470417?from=search&seid=9275043167445755699。菜鸡如我就还没看懂。

分割线后半部分教程来自 https://www.luogu.org/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi

教程一

问题引入

给定整数 N 和 M 。求满足 \(1 \leq x \leq N, 1 \leq y \leq M\)\(gcd(x, y)\) 为质数的点对 \((x, y)\) 的个数。

数据范围: \(1 \leq N,M \leq 1000000\)

莫比乌斯(Mobius)函数:

\[ \mu(x) = \begincases 1 & \text: x = 1 \\ -1 & \text: x = p_1p_2...p_k(p_i为不相同质数) \\ 0 & \text: 其他情况 \endcases \]

线性筛

int prime[maxn], prime_tot;
bool prime_tag[maxn];
int mu[maxn];
void pre_calc(int lim) 
    mu[1] = 1;
    for(int i = 2; i <= lim; i++) 
        if(!prime_tag[i]) 
            prime[++prime_tot] = i;
            mu[i] = -1;
        
        for(int j = 1; j <= prime_tot; j++) 
            if(i*prime[j] > lim) 
                break;
            
            prime_tag[i*prime[j]] = true;
            if(i % prime[j] == 0) 
                mu[i*prime[j]] = 0;
                break;
            
            else 
                mu[i*prime[j]] = -mu[i];
            
        
    

狄利克雷卷积

\[ (f*g)(n) = \sum_d|nf(d)g(\fracnd) \]

积性函数

积性函数:指对于所有互质的整数 a 和 b 有 \(f(ab)=f(a)f(b)\) 的数论。

  • 欧拉函数\(\varphi(n)\)
  • 莫比乌斯函数\(\mu(n)\)
  • 单位函数:\(Id(n) = n\)
  • 不变函数:\(1(n) = 1\)
  • 幂函数:\(Idk(n) = n^k\)
  • 因子个数函数:\(d(n), d = 1*1\)
  • 因子和函数:\(\sigma(n), \sigma = 1 * Id\)
  • 因子函数:\(\sigma k(n)\)
  • 狄利克雷卷积单位元\(\varepsilon = [n == 1]\)

莫比乌斯反演

\[ g(n) = \sum_d|nf(d) \rightarrow f(n) = \sum_d|n \mu(d)g(\fracnd) \g(n) = \sum_n|df(d) \rightarrow f(n) = \sum_n|d \mu(\fracdn)g(d) \]

证明一

\[ g = f * 1, \mu * g = f * 1 * \mu = f \]

证明二

\[ \beginaligned \sum_n|d \mu(\fracdn)g(d) &= \sum_k \mu(k)g(nk) \&= \sum_k \mu(k) \sum_(nk)|tf(t) \&= \sum_tf(t) \sum_(nk)|t \mu(k) \&= \sum_tf(t) \varepsilon(\fractn) \&= f(n) \endaligned \]

解决问题

\(\sum_1\leq i \leq N \sum_1 \leq j \leq M[gcd(i, j) == p]\),p是质数

\[f(p) = \sum_1\leq i \leq N \sum_1 \leq j \leq M[gcd(i, j) == p]\]

\[g(p) = \sum_1\leq i \leq N \sum_1 \leq j \leq M[p | gcd(i, j)]\]

那么,

\[g(n) = \sum_n|df(d) 且有 g(n) = \lfloor\fracNn\rfloor \lfloor\fracMn\rfloor\]

\[f(n) = \sum_n|d \mu(\fracdn)g(d) = \sum_n|d \mu(\fracdn) \lfloor\fracNd\rfloor \lfloor\fracMd\rfloor\]

\[ \beginaligned ans &= \sum_n \in prime \sum_n|d \mu(\fracdn) \lfloor\fracNd\rfloor \lfloor\fracMd\rfloor \&= \sum_n \in prime \sum_t \mu(t) \lfloor\fracNnt\rfloor \lfloor\fracMnt\rfloor (t := d/n) \&= \sum_1 \leq k \leq min(N,M) \lfloor\fracNk\rfloor \lfloor\fracMk\rfloor \sum_n|k,n \in prime \mu(\frackn) (k := nt) \endaligned \]

\[sum(k) := \sum_n|k,n \in prime \mu(\frackn) 可以预处理\]

for(int i = 1; i <= prime_tot; i++) 
    for(int j = 1; prime[i] * j <= up; j++) 
        sum[prime[i] * j] += mu[j];
    

\[ans = = \sum_1 \leq k \leq min(N,M) \lfloor\fracNk\rfloor \lfloor\fracMk\rfloor sum(k)\]

整除分块

\(\lfloor \fracNk \rfloor(1 \leq k \leq N)\) 有约 \(2\sqrtN\) 个可能值。快速计算 \(\sum_\lfloor \fracNk \rfloor\) 的方法:

for(int l = 1; l <= N; l = r+1) 
    r = N / (N/l);
    ans += (r-l+1) * (N/l);

杜教筛

\(\sum^n_i=1\mu(i),n \leq 10^12\)

\[M(n) := \sum^n_i=1\mu(i)\]

\[1 = \sum^n_i=1\varepsilon(i) = \sum^n_i=1\sum_d|i\mu(d) = \sum^n_i=1\sum^\lfloor \fracni \rfloor_j=1u(j) = \sum^n_i=1M(\lfloor \fracni \rfloor)\]

\[M(n) = 1 - \sum^n_i=2M(\lfloor \fracni \rfloor)\]

int mu_sum[maxn];
unordered_map<long long, int> mp;

int mu_calc(long long n) 
    if(n < lim) 
        return mu_sum[n];
    
    if(mp.count(n)) 
        return mp[n];
    
    int ret = 1;
    for(long long l = 2, r; l <= n; l = r+1) 
        r = n / (n/l);
        ret -= (r-l+1) * mu_calc(n/l);
    
    return mp[n] = ret;

---

教程二

先记住
\[[gcd(i,j) == 1] = \sum_d|gcd(i, j) \mu(d)\]

问题 #1


\[\sum^n_i=1 \sum^m_j=1 [gcd(i, j) == 1] , \ \ (n < m)\]

解法

\[原式 = \sum^n_i=1 \sum^m_j=1 \sum_d|gcd(i, j) \mu(d)\]

然后枚举 \(d\) ,显然有 \(d\in(1,n)\ \ [d | gcd(i,j)]\) ,于是将 \(d\) 提到前面去,则 \(i、j\) 都是 \(d\) 的倍数,化简得:

\[原式 = \sum^n_d=1 \mu(d) * \lfloor \fracnd \rfloor * \lfloor \fracmd \rfloor\]

后面的两个除法可以用上面攻略里的整除分块进行 \(o(\sqrtn)\) 复杂度的求解,当然也可以跑 \(o(n)\)

问题 #2


\[\sum^n_i=1 \sum^m_j=1 [gcd(i, j) == k] , \ \ (n < m)\]

解法

和上一题很像对吧,同时除以 k:

\[原式 = \sum^\lfloor \fracnk \rfloor_i=1 \sum^\lfloor \fracmk \rfloor_j=1 [gcd(i, j) == 1]\]

之后就一模一样了。

问题 #3


\[\sum^n_i=1 \sum^m_j=1 ij[gcd(i, j) == k] , \ \ (n < m)\]

解法

也是同时除以 k :

\[原式 = \sum^\lfloor \fracnk \rfloor_i=1 \sum^\lfloor \fracmk \rfloor_j=1 ij[gcd(i, j) == 1] * k^2\]

因为式子中 \(i、j\) 也被除了 k,需要在末尾补回来。

\[ \beginaligned 原式 &= \sum^\lfloor \fracnkd \rfloor_i=1 \sum^\lfloor \fracmkd \rfloor_j=1 ij \sum_d|gcd(i,j)\mu(d) * k^2 \&= \sum^\lfloor \fracnk \rfloor_d=1 \mu(d) * d^2 \sum^\lfloor \fracnkd \rfloor_i=1 \sum^\lfloor \fracmkd \rfloor_j=1 ij * k^2 \&= k^2 * \sum^\lfloor \fracnk \rfloor_d=1 \mu(d) * d^2 \sum^\lfloor \fracnkd \rfloor_i=1 i\sum^\lfloor \fracmkd \rfloor_j=1 j \endaligned \]

然后就发现后两项是个等差数列,也能在复杂度 \(o(\sqrtn)\) 下求出。

问题 #4


\[\sum^n_i=1 \sum^m_j=1 lcm(i, j)\]

解法

首先: \(lcm(i,j) = \fraci*jgcd(i, j)\),那么:

\[ \beginaligned 原式 &= \sum^n_d=1\sum^n_i=1 \sum^m_j=1 \fraci*jd * [gcd(i, j) == d] \ \ (同时除d)\&= \sum^n_d=1\sum^\lfloor \fracnd \rfloor_i=1 \sum^\lfloor \fracmd \rfloor_j=1 i*j*d * [gcd(i, j) == 1] \&= \sum^n_d=1\sum^\lfloor \fracnd \rfloor_i=1 \sum^\lfloor \fracmd \rfloor_j=1 i*j*d \sum_k|gcd(i,j) \mu(k) \ \ (枚举k)\&= \sum^n_d=1d \sum^\lfloor \fracnd \rfloor_k=1 \mu(k)*k^2 \sum^\lfloor \fracndk \rfloor_i=1i\sum^\lfloor \fracndk \rfloor_j=1j \endaligned \]

此时已经 \(o(n)\) 了,\(\lfloor \fracnd \rfloor\) 可以分一次块,\(\lfloor \fracndk \rfloor\) 也可以分一次。所以是 \(o(n)\)

后面原作者给出了更优解,我这里懒得贴过程了。也懒得记了。超出我承受范围了。

问题 #5


\[\sum^n_i=1 \sum^m_j=1 d(i*j)\]

其中,\(d(i, j)\) 表示 \(i*j\) 的约数个数。

解法

拿出小本本记个公式:
\[d(i*j) = \sum_x|i \sum_y|j [gcd(x,y) == 1]\]

怎么证明的,我不想知道...请移步原作者博客。

---

虽然我什么都还不会

就先这样好了,下班了QAQ。

以上是关于莫比乌斯反演入门解析的主要内容,如果未能解决你的问题,请参考以下文章

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

莫比乌斯反演入门

掌握莫比乌斯反演~彻底入门

[知识点]莫比乌斯反演入门

莫比乌斯反演题目列表

莫比乌斯反演入门