莫反

前置知识

一些数论函数

\[\epsilon(n) = \begin{cases} 1 & n = 1 \\ 0 & n > 1 \end{cases} \]

\[1(n) = 1 \]

$$\varphi(n)$$

\[id(n) = n \]

\[\tau(n) = \sum_{d|n}1,即 n 的约数个数 \]

\[\sigma(n) = \sum_{d|n}d \]

狄利克雷卷积

数论函数 \(f(n)\)\(g(n)\) 的狄利克雷卷积,记作 \(f * g\),定义为数论函数:

\[(f*g)(n)=\sum_{k|n}f(k)g(\frac{n}{k}) \]

莫比乌斯函数

定义

\[\mu(n) = \begin{cases} 1 & 1 \\ 0 & 含平方因子 \\ (-1)^k & 有 k 个质因数 \end{cases} \]

例如:\(\mu(12) = 0\)\(\mu(30) = -1\)\(\mu(210) = 1\)

性质

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

$\large \bm {证明}$

容易发现,当 \(n = 1\) 时完全正确。

\(f(n) = \sum_{d|n}\mu(d)\)

对于 \(\forall n = p1^{k1} \cdot p2^{k2} \cdots\),若 \(\exists k_i, k_i > 1\),则此时 \(\mu(n) = 0\),可以忽略。

故在此只有 \(x\) 形如 \(n = p1 \cdot p2 \cdot p3 \cdots\) 会对答案产生影响。

故只需考虑因子个数 \(k\)

由组合数学,有 \(f(n) = \sum_{i = 0}{k} \binom{k}{i}(-1)^i = (1 - 1)^k = 0^k\)

得证。

推论等式

\[f * \epsilon = f \]

\[\mu * 1 = \epsilon \]

\[1 * 1 = \tau \]

\[id * 1 = \sigma \]

\[id * \mu = \varphi \]

\[\varphi * 1 = id \]

预处理

由定义易知,\(\mu(n)\) 是积性函数(但不是完全积性函数),即对于 \(\forall (x, y), gcd(x, y) = 1\),有 \(\mu(x\cdot y) = \mu(x) \cdot \mu(y)\)

则根据积性函数的性质,我们可以很容易地使用埃氏筛或线性筛预处理 \(1\sim n\) 的莫比乌斯函数。

//埃氏筛
bitset<10000010> vis;
int mu[1000010];  
void init_e(int n){
	for(int i = 1; i <= n; i ++) mu[i] = 1;
	for(int i = 2; i <= n; i ++) if(!vis[i]){
		mu[i] = -1;
		for(int j = 2 * i; j <= n; j += i) {
			vis[j] = 1;
			if((j / i) % i == 0) mu[j] = 0;
			else mu[j] *= -1;
		}
	}
}
// 线性筛
bitset<10000010> vis;
int mu[1000010];  
int p[1000010], cnt;
void init_x(int n) {
    mu[1] = 1;
    for(int i = 2; i <= n; i ++){
        if (!vis[i]) p[cnt ++] = i, mu[i] = -1;
        for (int j = 0; p[j] * i <= n; j++) {
            vis[p[j] * i] = true;
            if (i % p[j] == 0) break;
            mu[i * p[j]] = -mu[i];
        }
    }
}

莫比乌斯反演

公式

\[f(n) = \sum_{d|n}g(d) \iff g(n) = \sum_{d|n}f(d) \cdot \mu(\frac{n}{d}) \]

$\large \bm {证明}$

以从右向左证为例:

\[\sum_{d | n} f(d) \cdot \mu(\frac{n}{d}) \]

\[= \sum_{d | n} \mu(\frac{n}{d}) \sum_{d' | d} g(d') \]

\[= \sum_{d'|n}g(d')\sum_{d} [\frac{n}{d} | \frac{n}{d'}] \mu (\frac{n}{d}) \]

\[= \sum_{d'|n}g(d')\sum_{d} [d'' | \frac{n}{d'}] \mu (d'') \]

\[= \sum_{d'|n}g(d')[\frac{n}{d'}=1] = g(n) \]

证毕。

一般用法

莫反主要用来推式子。

下面以一道题为例:

\(\sum_{i = 1}^{n}\sum_{j = 1}^{m} \gcd(i,j)\),其中 \(n \le m \le 10^7\)

推式子:

将原本的求和拆分成求个数:

\[\sum_{i = 1}^{n} \sum_{j = 1}^m \gcd(i, j) \]

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

\(gcd\) 中的 \(k\) 消掉:

\[= \sum_{k = 1}^n k \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor} [\gcd(\lfloor \frac{i}{k} \rfloor, \lfloor \frac{j}{k} \rfloor) = 1] \]

则含 \(gcd\) 的表达式由 \(\epsilon\) 定义得:

\[= \sum_{k = 1}^n k \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor} \epsilon(\gcd(i, j)) \]

\(\mu * 1 = \epsilon\) 替换得:

\[= \sum_{k = 1}^n k \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{k} \rfloor} \sum_{d|\gcd(i, j)}\mu(d) \]

交换顺序,提前 \(\mu\) 得:

\[= \sum_{k = 1}^n k \sum_d \mu(d) \sum_{i = 1}^{\lfloor \frac{n}{kd} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{kd} \rfloor} 1 \]

发现右边部分可以直接求和,由此直接得:

\[= \sum_{k = 1}^n k \sum_d \mu(d) \cdot {\lfloor \frac{n}{kd} \rfloor} \cdot {\lfloor \frac{m}{kd} \rfloor} \]

\(T = dk\)

\[= \sum_{T = 1}^n \sum_{k = 1}^n \sum_{k|T}k \cdot \mu(\lfloor \frac{T}{k} \rfloor) \cdot {\lfloor \frac{n}{T} \rfloor} \cdot {\lfloor \frac{m}{T} \rfloor} \]

\(id * \mu = \varphi\) 得:

\[= \sum_{T = 1}^n \varphi(T) \cdot {\lfloor \frac{n}{T} \rfloor} \cdot {\lfloor \frac{m}{T} \rfloor} \]

至此,式子全部推完。

那么,针对当前这个式子,我们神奇地发现它可以使用数论分块 \(\mathcal O(\sqrt{n})\) 处理完成。

最终时间:\(\mathcal O(n\sqrt{n})\)

Code
#include<bits/stdc++.h>

using namespace std;

#define int long long

bitset<10000010> vis;
int phi[1000010], s[1000010];  
int p[1000010], cnt;

void init(int n){
	vis[1] = 1;
	s[1] = 1;
	for(int i = 2; i <= n; i ++){
		if(!vis[i]) p[++ cnt] = i, phi[i] = i - 1;
		for(int j = 1; j <= cnt && p[j] * i <= n; ++ j){
			vis[i * p[j]] = 1;
			if(!(i % p[j])) { phi[i * p[j]] = phi[i] * p[j]; break; }
			phi[i * p[j]] = phi[i] * (p[j] - 1);
		}
		s[i] = s[i - 1] + phi[i];
	}
}


signed main(){
	int n; scanf("%lld", &n);
	init(n);
	int ans = 0;
	for(int i = 1, j; i <= n; i = j + 1){
		j = n / (n / i); 
		ans += (n / i) * (n / i) * (s[j] - s[i - 1]);
	}
	printf("%lld\n", ans);
	return 0;
}

恭喜你,已经学会了莫反,去推更多的式子吧!

例题们

[集训队互测 2010] Crash的数字表格 / JZPTAB

题意:求 \(\sum_{i = 1}^n \sum_{j = 1}^m \text{lcm}(i, j)\)

解法:

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

\[= \sum_{d = 1}^{n} d \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} i\cdot j \cdot [\gcd(i, j) = 1] \]

\[= \sum_{d = 1}^{n} d \sum_{k = 1}^{\lfloor \frac{n}{d} \rfloor} k^2 \sum_{i = 1}^{\lfloor \frac{n}{dk} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{dk} \rfloor} i\cdot j \cdot \mu(k) \]

\[= \sum_{d = 1}^{n} d \sum_{k = 1}^{\lfloor \frac{n}{d} \rfloor} k^2 \cdot \mu(k) \frac{\lfloor \frac{n}{dk} \rfloor(\lfloor \frac{n}{dk} \rfloor + 1)}{2} \frac{\lfloor \frac{m}{dk} \rfloor(\lfloor \frac{m}{dk} \rfloor + 1)}{2} \]

P3911 最小公倍数之和

\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}\text{lcm}(a_i, a_j)\)

我们发现直接求并不可求,因为 \(a_i\)\(i\) 没有关系,于是我们更改策略。

让我们用 \(c_i\) 表示 \(i\) 这个数在 \(a\) 中出现的次数,记 \(n\)\(\max\{a_i\}\)

那么原式就等价于:

\[\sum_{i = 1}^{n}\sum_{j = 1}^{n}c_i\cdot c_j \cdot \text{lcm}(i, j) \]

\[= \sum_{k = 1}^{n} \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j = 1}^{\lfloor \frac{n}{k} \rfloor} c_{id} \cdot c_{jd} \cdot i \cdot j \cdot [\gcd(i, j) = 1] \]

\[= \sum_{k = 1}^{n} \sum_{i = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j = 1}^{\lfloor \frac{n}{k} \rfloor} \sum_{d|\gcd(i,j)} \mu(d) c_{id} \cdot c_{jd} \cdot ijk \]

\[= \sum_{k = 1}^{n} \sum_{d = 1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \cdot d^2 \sum_{i = 1}^{\lfloor \frac{n}{dk} \rfloor}\sum_{i = 1}^{\lfloor \frac{n}{dk} \rfloor} c_{idk} \cdot c_{jdk} \cdot ijk \]

\[= \sum_{T = 1}^{n}T(\sum_{d|T}\mu(d)\cdot d)(\sum_{i = 1}^{\lfloor \frac{n}{T} \rfloor} c_{iT} \cdot i)^2 \]

使用线性筛和预处理即可 \(O(n \log{n})\) 通过本题。

posted @ 2026-07-16 14:52  Hty111  阅读(6)  评论(0)    收藏  举报