莫比乌斯反演入门解析

以下教程前半部分来自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) = \begin{cases} 1 & \text{: } x = 1 \\ -1 & \text{: } x = p_1p_2...p_k(p_i为不相同质数) \\ 0 & \text{: 其他情况} \end{cases}
\]

线性筛

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|n}f(d)g(\frac{n}{d})
\]

积性函数

积性函数:指对于所有互质的整数 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|n}f(d) \rightarrow f(n) = \sum_{d|n} \mu(d)g(\frac{n}{d}) \g(n) = \sum_{n|d}f(d) \rightarrow f(n) = \sum_{n|d} \mu(\frac{d}{n})g(d)
\]

证明一

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

证明二

\[
\begin{aligned}
\sum_{n|d} \mu(\frac{d}{n})g(d) &= \sum_{k} \mu(k)g(nk) \&= \sum_{k} \mu(k) \sum_{(nk)|t}f(t) \&= \sum_{t}f(t) \sum_{(nk)|t} \mu(k) \&= \sum_{t}f(t) \varepsilon(\frac{t}{n}) \&= f(n)
\end{aligned}
\]

解决问题

求 \(\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|d}f(d) 且有 g(n) = \lfloor{\frac{N}{n}}\rfloor \lfloor{\frac{M}{n}}\rfloor\]

\[f(n) = \sum_{n|d} \mu(\frac{d}{n})g(d) = \sum_{n|d} \mu(\frac{d}{n}) \lfloor{\frac{N}{d}}\rfloor \lfloor{\frac{M}{d}}\rfloor\]

\[
\begin{aligned}
ans &= \sum_{n \in prime} \sum_{n|d} \mu(\frac{d}{n}) \lfloor{\frac{N}{d}}\rfloor \lfloor{\frac{M}{d}}\rfloor \&= \sum_{n \in prime} \sum_{t} \mu(t) \lfloor{\frac{N}{nt}}\rfloor \lfloor{\frac{M}{nt}}\rfloor (t := d/n) \&= \sum_{1 \leq k \leq min(N,M)} \lfloor{\frac{N}{k}}\rfloor \lfloor{\frac{M}{k}}\rfloor \sum_{n|k,n \in prime} \mu(\frac{k}{n}) (k := nt)
\end{aligned}
\]

\[sum(k) := \sum_{n|k,n \in prime} \mu(\frac{k}{n}) 可以预处理\]

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{\frac{N}{k}}\rfloor \lfloor{\frac{M}{k}}\rfloor sum(k)\]

整除分块

\(\lfloor \frac{N}{k} \rfloor(1 \leq k \leq N)\) 有约 \(2\sqrt{N}\) 个可能值。快速计算 \(\sum_{}\lfloor \frac{N}{k} \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 \frac{n}{i} \rfloor}_{j=1}u(j) = \sum^{n}_{i=1}M(\lfloor \frac{n}{i} \rfloor)\]

\[M(n) = 1 - \sum^{n}_{i=2}M(\lfloor \frac{n}{i} \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 \frac{n}{d} \rfloor * \lfloor \frac{m}{d} \rfloor\]

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

问题 #2


\[\sum^{n}_{i=1} \sum^{m}_{j=1} [gcd(i, j) == k] , \ \ (n < m)\]

解法

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

\[原式 = \sum^{\lfloor \frac{n}{k} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{k} \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 \frac{n}{k} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{k} \rfloor}_{j=1} ij[gcd(i, j) == 1] * k^2\]

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

\[
\begin{aligned}
原式 &= \sum^{\lfloor \frac{n}{kd} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{kd} \rfloor}_{j=1} ij \sum_{d|gcd(i,j)}\mu(d) * k^2 \&= \sum^{\lfloor \frac{n}{k} \rfloor}_{d=1} \mu(d) * d^2 \sum^{\lfloor \frac{n}{kd} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{kd} \rfloor}_{j=1} ij * k^2 \&= k^2 * \sum^{\lfloor \frac{n}{k} \rfloor}_{d=1} \mu(d) * d^2 \sum^{\lfloor \frac{n}{kd} \rfloor}_{i=1} i\sum^{\lfloor \frac{m}{kd} \rfloor}_{j=1} j
\end{aligned}
\]

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

问题 #4


\[\sum^{n}_{i=1} \sum^{m}_{j=1} lcm(i, j)\]

解法

首先: \(lcm(i,j) = \frac{i*j}{gcd(i, j)}\),那么:

\[
\begin{aligned}
原式 &= \sum^{n}_{d=1}\sum^{n}_{i=1} \sum^{m}_{j=1} \frac{i*j}{d} * [gcd(i, j) == d] \ \ (同时除d)\&= \sum^{n}_{d=1}\sum^{\lfloor \frac{n}{d} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{d} \rfloor}_{j=1} i*j*d * [gcd(i, j) == 1] \&= \sum^{n}_{d=1}\sum^{\lfloor \frac{n}{d} \rfloor}_{i=1} \sum^{\lfloor \frac{m}{d} \rfloor}_{j=1} i*j*d \sum_{k|gcd(i,j)} \mu(k) \ \ (枚举k)\&= \sum^{n}_{d=1}d \sum^{\lfloor \frac{n}{d} \rfloor}_{k=1} \mu(k)*k^2 \sum^{\lfloor \frac{n}{dk} \rfloor}_{i=1}i\sum^{\lfloor \frac{n}{dk} \rfloor}_{j=1}j
\end{aligned}
\]

此时已经 \(o(n)\) 了,\(\lfloor \frac{n}{d} \rfloor\) 可以分一次块,\(\lfloor \frac{n}{dk} \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。

原文地址:https://www.cnblogs.com/Decray/p/11215469.html

时间: 2024-11-08 11:17:23

莫比乌斯反演入门解析的相关文章

BZOJ 2301 莫比乌斯反演入门

2301: [HAOI2011]Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5 1 1 5 1 5 2 Sample Output 14 3此题作为我的莫比

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

因为今天有较为充足的时间,于是果断入坑反演OvO 直接上公式和概念: 定理:和是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论 在上面的公式中有一个函数,称其为莫比乌斯函数 它的定义如下: (1)若,那么 (2)若,均为互异素数,那么 (3)其它情况下 对于函数,它有如下的常见性质: (1)对任意正整数有 (2)对任意正整数有 (3)为积性函数 数论上积性函数的定义:     积性函数的性质: ①  ②积性函数的前缀和也是积性函数 由此可以线性求出莫比乌斯函数: mu[1]=1;

莫比乌斯反演入门

Preface 莫比乌斯反演,数论中最令人头疼的一部分.可以把一些十分困难的问题变得依然很困难简单. 很早之前就想好好学一下反演,但苦于连\(\mu\)的意义都搞不懂.直到有一天我偶然看到了一句话: 那些各种各样的性质与定理,大多是前人几年甚至几十年才得出来的,哪里是你几天就能理解并证明的. (PS:每当你阅读本文并感到无法理解时,请再次阅读一遍上面的话.) 因此我就开始一脸懵逼地强行学习起反演了,一段时间之后发现也没有那么难理解. 学习的过程大多参照peng-ym's blog 关于莫比乌斯函

hdu 1695 莫比乌斯反演

hdu 1695 莫比乌斯反演 题意: 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k 的数对(x,y)的对数. 限制: a=c=1; 0 < b,c <= 1e5; (n1,n2) 和 (n2,n1) 算为同种情况 思路: 其实是求满足1 <= x <= b/k && 1 <= y <= d/k && gcd(x,y

hdu1569 莫比乌斯反演

hdu 1695 莫比乌斯反演 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k 的数对(x,y)的对数. a=c=1; 0 < b,c <= 1e5; (n1,n2) 和 (n2,n1) 算为同种情况 其实是求满足1 <= x <= b/k && 1 <= y <= d/k && gcd(x,y)=1 的 数对(x,y

莫比乌斯反演题目列表

前言: 本题表中,凡是涉及\(n.m\),都默认\(n \leq m\). Part1 这些题目都非常水,莫比乌斯反演入门题, 主要是对莫比乌斯反演应用有一个基本概念. 1.[HAOI2011]Problem b (具体题目戳我) 题目:一组数据(\(a.d.c.d \leq 5×10^4\))求 \[\sum_{i=a}^{b} \sum_{j=c}^d [gcd(i,j)=d]\] 题解: \[\sum_{i=1}^{n} \sum_{j=1}^m [gcd(i,j)=d] = \sum_{

bzoj 2820 luogu 2257 yy的gcd (莫比乌斯反演)

题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便表述,由于n和m等价,以下内容均默认n<=m 题目让我们求:$\sum_{k=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$ 容易变形为:$\sum_{k=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{k} \righ

莫比乌斯反演(入门)

细细算来,看反演已经有一两个星期了 刚开始的时候也是走了不少的弯路 和其他的算法一样,只要你懂了,就会有一种不过如此的感觉(误 感觉反演还是刚入门,不过还是先写一篇不完全的总结吧,不然过段时间就要忘记了 虽说看反演看了好久才懂,但是现在回头看看,其实很多时间还是花费在弯路上,真正的输出时间不过是最近的一两天 建议的前置技能: 容斥的简单应用 唯一分解定理 欧拉函数的定义 积性函数的定义 然后就可以看反演啦 反演推荐的资料还是贾志鹏线性筛 不要在电脑上直接过一遍就算看过了,这个资料上面有一些不加证

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

一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数\(\mu(n)\)为: 当n有平方因子时,\(\mu(n)=0\). 当n没有平方因子时,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同质因子的个数. 性质1: \(\sum_{d|n}\mu(d)=[n=1]\) 证明:我们把n分解质因数,则原式\(=(-1+1)^{\omega(n)}=0\). 因为对于不同的质因子,只有选和不选两种方案,这是一个组合数相加的形式,偶数加奇数减,根据二项式