莫比乌斯反演
1 数论分块
数论分块是莫比乌斯反演的前置知识之一,其主要用于快速求解一些含有除法向下取整的和式,例如
下面先说明几个引理。
1.1 引理
引理 1:
也就是说
证明:
对于
对于
这个引理保证了数论分块的复杂度是正确的
引理 2:
成立的最大的满足
证明:
考虑设
然后我们即可得到:
所以
这个引理告诉我们对于一个块,如果其之内的值全部都是
那么根据上面两个基本的引理,实际上我们就已经能求解一些简单的东西了。具体的,我们每一次求出块的左右端点,按照要求求出相应值,再转移左端点即可。
例 1: [CF1263C] Everyone is a Winner!
我们直接按照上面的思想转移区间即可,代码如下:
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2e5 + 5;
const int Inf = 2e9;
int T, n;
int tot[Maxn], cnt = 0;
void solve() {
cin >> n;
cnt = 0;
int l = 1, r = 0;
while(l <= n) {
r = n / (n / l);
tot[++cnt] = n / l;
l = r + 1;
}
tot[++cnt] = 0;
sort(tot + 1, tot + cnt + 1);
cout << cnt << '\n';
for(int i = 1; i <= cnt; i++) cout << tot[i] << " ";
cout << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> T;
while(T--) solve();
return 0;
}
引理 3:
证明:
设
所以有:
2 莫比乌斯反演
2.1 概念
莫比乌斯反演是数论中的重要内容,对于一些函数
2.2 莫比乌斯函数
2.2.1 定义
定义莫比乌斯函数
2.2.2 性质
莫比乌斯函数的性质较多,有如下几条。
性质 1:
这意味着
性质 2:
证明:
考虑设
则
由二项式定理易知上式值为
性质 3:
证明:
其实就是性质
2.2.3 线性筛求解
上文提到过
代码如下:
int prim[Maxn], cnt, mu[Maxn];
bool vis[Maxn];
void init(int N) {
mu[1] = 1;
for(int i = 2; i <= N; i++) {
if(!vis[i]) {
prim[++cnt] = i;
mu[i] = -1;
}
for(int j = 1; j <= cnt && prim[j] * i <= N; j++) {
vis[prim[j] * i] = 1;
if(i % prim[j] == 0) {
mu[prim[j] * i] = 0;
break;
}
mu[prim[j] * i] = -mu[i];
}
}
}
2.3 莫比乌斯变换
设
那么有:
我们称这种形式下的
考虑如何证明,我们对原式进行如下变换即可:
当然莫比乌斯反演还有第二种形式,即倍数的形式:
如果有:
那么有:
那么以上就是莫比乌斯反演的基础内容,下面我们来看题目中的实际运用。
3 例题
莫比乌斯反演可以处理一类求和式,形如:
下面举三例讲解如何操作这类求和式。
例 2:YY的GCD。
题意: 求
不妨先令
发现分母是两个变量,难以数论分块求解。考虑设
令
预处理出
例 3: [SDOI2014] 数表。
题意: 设
依然假设
后面的和式处理仿照上一题显然可得:
仍然令
令
到这里和上一题是一样的,难点在于
然后会发现此时我们不能单次去处理前缀和,不然复杂度会爆炸,接着不难想到利用树状数组进行单点修改、区间查询,最后数论分块求解即可。
例 4:[SDOI2015] 约数个数和。
题意:设
首先需要了解
证明如下:
考虑两者相乘后的约数的因子,对其进行质因数分解。假如其中有一项是
,并且这个质数在 的分解式中分别表现为 。我们钦定先从 中选,因此:
- 若
,我们认为该因子所有的 都来自于 ,此时 选出的数在这一项上互质。 - 若
,则我们会先选 中的 ,然后选 中的 。我们可以认为,当我们从 中选 这个质数的时候, 一定是选满了的。所以我们可以认为,当 选了这个质数而 没有选时,其实是 已经选满了。这样也能保证不漏情况。发现此时 选出的数在这一项上同样互质。 综上,对于每一项,
选出的数都是互质的。因此最后的总方案数就是二者互质的方案数。
然后原式可以化为:
考虑后面的两个和式,设
令
预处理出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律