P3455 学习笔记 & 莫比乌斯反演详解
突然发现自己做题计划里有这道题,就顺便学了一下莫比乌斯反演。
算法详解
莫比乌斯函数
其核心就是莫比乌斯函数 \(\mu(n)\),定义在 \(\Z^+\) 上,取值规则为:
-
当 \(n=1\) 时,\(\mu(n)=1\)
-
当 \(n \ne 1\) 时
- 若存在一个质数 \(p\),使得 \(p^2 \mid n\),则 \(\mu(n)=0\)
- 若不存在,设 \(n\) 的不同质因子个数为 \(k\),则 \(\mu(n)=(-1)^k\)
在这样的定义下,莫比乌斯函数 \(\mu(n)\) 有一个关键的性质:
莫比乌斯反演
设 \(f\) 和 \(g\) 为定义在 \(\Z^+\) 上的两个函数,且
那么我们可以反过来用 \(g\) 表示 \(f\),即
等价地,可以写成
这就是莫比乌斯反演的标准形式。
有时候我们也会遇到这样的情形:
反演公式为
莫比乌斯反演公式证明
即已知
要证
将条件代入右式
根据莫比乌斯函数的求和性质,当 \(\frac ne=1\) 即 \(n=e\) 时,内层和
当 \(\frac ne >1\) 即 \(n>e\) 时,内层和
故
证毕。
P3455
问题要求满足 \(\gcd(x,y)=d\) 的二元组 \((x,y)\) 的个数,即求
注意到 \(\gcd(x,y)=d\) 等价于 \(d \mid x\) 且 \(d \mid y\) 且 \(\gcd(\frac xd, \frac yd)=1\),所以可以令 \(a'=\left \lfloor \frac ad \right \rfloor,b'=\left \lfloor \frac bd \right \rfloor\),所以问题即求
又莫比乌斯函数 \(\mu(n)\) 有性质
这个性质可以用来表示函数 \([\gcd(x,y)=1]\),因为 \([\gcd(x,y)=1]=1\) 成立当且仅当 \(\gcd(x,y)\) 的所有因子中只有 \(1\) 对于求和有贡献,所以
所以答案为
可以交换求和顺序,先对 \(d\) 求和,再对 \(x,y\) 求和。
此时我们先枚举 \(d\),则 \(d \mid x\) 且 \(d \mid y\),令 \(x=di,y=dj\),则 \(1 \le i \le \frac {a'}d,1 \le j \le \frac{b'}d\),于是答案为
预处理 \(\mu(d)\) 的值,预期时间复杂度 \(O(n \cdot \min(a',b'))\),会喜提 TLE,则我们需要优化。
看到 \([\frac{a'}d]\) 这种东西,我们想到整除分块,可以将时间复杂度降到 \(O(n \cdot \sqrt{\min(a',b')})\)。
对了,整除分块的时候记得预处理 \(\mu(d)\) 的前缀和。
具体实现:
- 先预处理 \(\mu(n)\) 的值,顺手用线性筛筛质数,预处理复杂度 \(O(n)\)。
预处理code
mubius[1] = 1;
for (ll i = 2; i <= maxn - 5; i++){
if (!vis[i]){
prime[++tot] = i;
mubius[i] = -1;
}
for (ll j = 1; j <= tot && i * prime[j] <= maxn - 5; j++){
vis[i * prime[j]] = true;
if (!(i % prime[j])){
mubius[i * prime[j]] = 0;
break;
}
else
mubius[i * prime[j]] = -mubius[i];
}
}
- 再整除分块维护答案,时间复杂度 \(O(n \cdot \sqrt{\min(a',b')})\)。
整除分块code
for (ll l = 1, r; l <= min(a, b); l = r + 1){
r = min(a / (a / l), b / (b / l));
ans += (pre[r] - pre[l - 1]) * (a / l) * (b / l);
}
那么,就做完了。

浙公网安备 33010602011771号