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)\) 有一个关键的性质:

\[\sum_{d \mid n} \mu(d)= \begin{cases} 1 & n=1\\ 0 & n \ne 1 \end{cases} \]

莫比乌斯反演

\(f\)\(g\) 为定义在 \(\Z^+\) 上的两个函数,且

\[g(x)=\sum_{d \mid x} f(x) \]

那么我们可以反过来用 \(g\) 表示 \(f\),即

\[f(x)=\sum_{d \mid x} \mu(d) g(\frac nd) \]

等价地,可以写成

\[f(x)=\sum_{d \mid x} \mu(\frac nd) g(d) \]

这就是莫比乌斯反演的标准形式。

有时候我们也会遇到这样的情形:

\[G(n)=\sum_{i=1}^\infty F(ni) \]

反演公式为

\[F(ni)=\sum_{i=1}^ \infty \mu(i) G(ni) \]

莫比乌斯反演公式证明

即已知

\[g(n)=\sum_{d \mid n} f(d) \]

要证

\[f(n)=\sum_{d \mid n} \mu(d) g(\frac nd) \]

将条件代入右式

\[\begin{align*} \sum_{d \mid n} \mu(d) g(\frac nd)&=\sum_{d \mid n} \mu(d) \sum_{e \mid \frac nd} f(e)\\ &=\sum_{e \mid n} f(e) \sum_{d \mid \frac ne} \mu(d) \end{align*} \]

根据莫比乌斯函数的求和性质,当 \(\frac ne=1\)\(n=e\) 时,内层和

\[\sum_{d \mid \frac ne}=1 \]

\(\frac ne >1\)\(n>e\) 时,内层和

\[\sum_{d \mid \frac ne}=0 \]

\[f(x)=\sum_{e \mid n} f(e) \sum_{d \mid \frac ne} \mu(d)=\sum_{d \mid n} \mu(d) g(\frac nd) \]

证毕。

P3455

题目传送门

问题要求满足 \(\gcd(x,y)=d\) 的二元组 \((x,y)\) 的个数,即求

\[\sum_{x=1}^a \sum_{y=1}^b [\gcd(x,y)=d] \]

注意到 \(\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\),所以问题即求

\[\sum_{x=1}^{a'} \sum_{y=1}^{b'} [\gcd(x,y)=1] \]

又莫比乌斯函数 \(\mu(n)\) 有性质

\[\sum_{d \mid n} \mu(d)=\begin{cases} 1 & n=1\\ 0 & n \ne 1 \end{cases} \]

这个性质可以用来表示函数 \([\gcd(x,y)=1]\),因为 \([\gcd(x,y)=1]=1\) 成立当且仅当 \(\gcd(x,y)\) 的所有因子中只有 \(1\) 对于求和有贡献,所以

\[[\gcd(x,y)=1]=\sum_{d \mid \gcd(x,y)} \mu(d) \]

所以答案为

\[\sum_{x=1}^{a'} \sum_{y=1}^{b'} \sum_{d \mid \gcd(x,y)} \mu(d) \]

可以交换求和顺序,先对 \(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\),于是答案为

\[\sum_{d=1}^{\min(a',b')} \mu(d) \cdot [\frac{a'}d] \cdot [\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);
}

那么,就做完了。

posted @ 2026-03-13 16:30  constexpr_ll  阅读(3)  评论(0)    收藏  举报