莫比乌斯反演

整除分块

用于快速求解形如下面的和式:

\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n}{i} \right \rfloor ) \]

通过预处理出 \(f(x)\) 的前缀和,可以在 \(O(\sqrt{n})\) 的时间内求出上面的式子.

性质

性质 1

\(D(n)=\{\left \lfloor \frac{n}{i} \right \rfloor|i\in[1,n]\bigcap N_+\}\),则有 \(|D(n)|\le 2\sqrt{n}\)

证明:

\(i\le\sqrt{n}\),则至多有 \(\sqrt{n}\) 种取值;
\(i>\sqrt{n}\),则 \(\left \lfloor \frac{n}{i} \right \rfloor<\sqrt{n}\),则至多有 \(\sqrt{n}\) 种取值;
综上,至多有 \(2\sqrt{n}\) 种取值.

性质 2

对于 \(d\in D(n)\),所有满足 \(\left \lfloor \frac{n}{i} \right \rfloor=d\) 的整数 \(i\) 的取值为:

\[\left \lfloor \frac{n}{d+1} \right \rfloor+1 \le i\le\left \lfloor \frac{n}{d} \right \rfloor \]

证明:

由于 \(\left \lfloor \frac{n}{i} \right \rfloor=d\),故有 \(d\le\frac{n}{i}<d+1\).
进一步地,有 \(\frac{n}{d+1}<i\le\frac{n}{d}\).
由于 \(i\in N_+\),所以有 \(\left \lfloor \frac{n}{d+1} \right \rfloor+1 \le i\le\left \lfloor \frac{n}{d} \right \rfloor\).

性质 3

\(m\in D(n)\),则有 \(D(m)\subseteq D(n)\).

证明:

\(m=\left \lfloor \frac{n}{k} \right \rfloor\),那么:

\[\left \lfloor \frac{m}{i} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{n}{k} \right \rfloor}{i} \right \rfloor=\left \lfloor \frac{n}{ki} \right \rfloor\in D(n) \]

过程

对于和式:

\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n}{i} \right \rfloor ) \]

我们将 \(\left \lfloor \frac{n}{i} \right \rfloor\) 相同的,使用乘法分配律,放在一起处理:

void Solve(){
	int n,ans=0;
	for(int L=1,R;L<=n;L=R+1)
		R=n/(n/L),ans+=(f[R]-f[L-1])*g[n/L];
}

其他

k 元形式

用于求解形如下面的和式:

\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n_1}{i} \right \rfloor,\left \lfloor \frac{n_2}{i} \right \rfloor,\dots,\left \lfloor \frac{n_k}{i} \right \rfloor) \]

将代码中的 \(R\) 换成 \(R\gets \min\{\left \lfloor \frac{n_1}{d} \right \rfloor,\left \lfloor \frac{n_2}{d} \right \rfloor,\dots,\left \lfloor \frac{n_k}{d} \right \rfloor\}\) 即可.

k 元的整除分块,时间复杂度为 \(O(k^2\sqrt{n})\).

证明:

定义 \(n_i\) 变化点:若 \(j\) 满足:\(\left \lfloor \frac{n_i}{j+1} \right \rfloor\ne \left \lfloor \frac{n_i}{j} \right \rfloor\),则其为一个变化点,显然 \(n_i\) 的变化点至多有 \(2\sqrt{n_i}\) 个.
因此 \(n_1,n_2,\dots,n_k\) 的变化点至多有 \(2k\sqrt{n}\) 个.
而代码中 \(R\) 一定是一个变化点,因此 \(R\) 至多有 \(2k\sqrt{n}\) 中.
算上枚举 \(\min\)\(O(k)\) 的复杂度,得出最终复杂度为 \(O(k^2\sqrt{n})\).

神秘恒等式

$\forall a,b,c\in N_+,\left \lfloor \frac{a}{bc} \right \rfloor =\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c} \right \rfloor $

证明:

\(\frac{a}{b}=\left\lfloor\frac{a}{b}\right\rfloor+r(0\le r<1)\)

则有:

\[\left \lfloor \frac{a}{bc} \right \rfloor =\left \lfloor\left (\lfloor \frac{a}{b} \right \rfloor+r)\times\frac{1}{c} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor \]

现证明:$\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c} \right \rfloor $

\[\begin{aligned} &\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right \rfloor \\ \Leftrightarrow & \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c}<\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right \rfloor+1\\ \Leftrightarrow & \left \lfloor \frac{a}{b} \right \rfloor+r<\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right\rfloor\times c+c\\ \Leftrightarrow & \left \lfloor \frac{a}{b} \right \rfloor-\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right\rfloor\times c+r<c\\ \Leftrightarrow & r<c-\left \lfloor \frac{a}{b} \right \rfloor\bmod c\\ \Leftrightarrow & r<1\\ \end{aligned} \]

得证.

Dirichlet 卷积

定义

数论函数 \(f(n)\)\(g(n)\) Dirichlet 卷积,记作 \(f\circ g\),定义为数论函数:

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

性质

\(f,g,h\) 都是数论函数,有:

  1. 交换律\(f\circ g=g\circ f\)
  2. 结合律\((f\circ g)\circ h=f\circ (g\circ h)\)
  3. 分配律\((f+g)\circ h=f\circ h+g\circ h\)
  4. 单位元\(f\circ \varepsilon =f\)

上面的性质代入验证即可得证.

计算

一般地,直接利用定义计算:

\[h(n)=\sum_{kl=n}f(k)g(l) \]

直接枚举 \(k\)\(l\),将贡献累加到 \(h(kl)\) 上:

void calc(){
	for(int k=1;k<=n;k++)
		for(int l=1;k*l<=n;k++)
			h[k*l]+=f[k]*g[l];
}

这样时间复杂度就是:

\[O(\sum_{k=1}^{n}\frac{n}{k})=O(n\log n) \]

莫比乌斯反演

莫比乌斯函数

定义莫比乌斯函数 \(\mu(n)\)

\[\mu(n)=\begin{cases} 0 &,\exists d>1,d^2|n\\ (-1)^k &,n 有 k 个质因子\\ \end{cases} \]

莫比乌斯函数性质

性质 1

\(\mu(n)\) 是积性函数

证明:分类验证即可.

性质 2

\[\sum_{d|n}\mu(d)=[n=1]=\varepsilon(n) \]

也就是:

\[\mu\circ 1=\varepsilon \]

证明:

由唯一分解定理,令 \(n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m},n'=p_1p_2\dots p_m\)
由于有重复质因子的数不会产生贡献,因此:

\[\sum_{d|n}\mu(d)=\sum_{d|n'}\mu(d)=\sum_{i=0}^m\binom{m}{i} (-1)^{i}\\ =\sum_{i=0}^m\binom{m}{i} (-1)^{i}1^{m-i}=(1+(-1))^m=[m=0]=[n=1] \]

莫比乌斯函数计算

可以用 \(O(\sqrt{n})\) 的质因数分解单次计算:

int mu(int x){
	int ans=1;
	for(int i=2;i*i<=x;i++)
		if(x%i==0){
			int cnt=0;
			while(x%i==0)x/=i,cnt++;
			if(cnt>1)return 0; ans=-ans;
		}
	if(x>1)ans=-ans; return ans;
}

由于 \(\mu(n)\) 为积性函数,因此可以 \(O(n)\) 用线性筛求解:

int prim[N],top,mu[N]; bool vis[N];
void init(){
	for(int i=2;i<=1e5;i++){
		if(!vis[i])prim[++top]=i,mu[i]=-1;
		for(int j=1;i*prim[j]<=1e5;j++){
			vis[i*prim[j]]=1,mu[i*prim[j]]=-mu[i];
			if(i%prim[j]==0){ mu[i*prim[j]]=0; break; }
		}
	}mu[1]=1;
}

莫比乌斯反演

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

证明:

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

另外,还有第二种形式:

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

证明同理.

神秘恒等式

先来推一些式子,方便以后的推导:

恒等式 1

\[[\gcd(i,j)=1]=\sum_{d}[d|i][d|j]\mu(d) \]

证明:

\[[\gcd(i,j)=1]=\sum_{d|\gcd(i,j)}\mu(u)=\sum_{d}[d|i][d|j]\mu(d) \]

恒等式 2

\[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]=\sum_{d}\mu(d)\left\lfloor\frac{n}{dx}\right\rfloor \left\lfloor\frac{m}{dx}\right\rfloor \]

证明:

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x] &=\sum_{i=1}^n\sum_{j=1}^m[\gcd(\frac{i}{x},\frac{j}{x})=1]\\ &=\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[\gcd(i,j)=1]\\ &=\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{d}[d|i][d|j]\mu(d)\\ &=\sum_{d}\mu(d)\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[d|i]\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[d|j]\\ &=\sum_{d}\mu(d)\left\lfloor\frac{n}{dx}\right\rfloor \left\lfloor\frac{m}{dx}\right\rfloor \end{aligned} \]

例题

YY的GCD

依据题意,写出下面的式子:

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

化简:

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)\in P] &=\sum_{i=1}^n\sum_{j=1}^m\sum_{p\in P}[\gcd(i,j)=p]\\ &=\sum_{p\in P}\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=p]\\ &=\sum_{p\in P}\sum_{d}\mu(d)\left\lfloor\frac{n}{dp}\right\rfloor \left\lfloor\frac{m}{dp}\right\rfloor\\ \end{aligned} \]

发现,这里面有一个 \(dp\) 乘积的形式,如果转化为除法,就能触发 Dirichlet 卷积.

于是,令 \(T=dp\),有:

\[ans=\sum_{T}\sum_{p\in P\wedge p|T}\mu(\frac{T}{p})\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor \]

\(f(T)=\sum_{p\in P\wedge p|T}\mu(\frac{T}{p})\),有:

\[ans=\sum_{T}f(T)\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor \]

预处理出 \(f(T)\) 的前缀和,就可以用整除分块 \(O(\sqrt{n})\) 求解.

上面换元的方法在很多题中都能使用,需要注意.

数表

依据题意,写出下面的式子:

\[ans=\sum_{i=1}^n\sum_{j=1}^m[\sigma(\gcd(i,j))\le a]\times \sigma(\gcd(i,j)) \]

化简:

\[\begin{aligned} ans &=\sum_{i=1}^n\sum_{j=1}^m\sum_k[\sigma(k)\le a]\times \sigma(k)\times [\gcd(i,j)=k]\\ &=\sum_k^{\sigma(k)\le a}\sigma(k)\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]\\ &=\sum_k^{\sigma(k)\le a}\sigma(k)\sum_{d}\mu(d)\left\lfloor\frac{n}{dk}\right\rfloor \left\lfloor\frac{m}{dk}\right\rfloor\\ &=\sum_k^{\sigma(k)\le a}\sum_{d}\sigma(k)\mu(d)\left\lfloor\frac{n}{dk}\right\rfloor \left\lfloor\frac{m}{dk}\right\rfloor\\ \end{aligned} \]

同理,令 \(T=dk\),有:

\[ans=\sum_{T}\sum_{k|T}^{\sigma(k)\le a}\sigma(k)\mu(\frac{T}{k})\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor \]

\(f(T)=\sum_{k|T}^{\sigma(k)\le a}\sigma(k)\mu(\frac{T}{k})\),由于这个式子其实本质是二元函数,

因此我们拿出常用处理二维问题的技巧:主席树/扫描线,这道题空间较小,只能用扫描线.

剩下的就是整除分块了;时间复杂度为 \(O(n\log^2n+Q\sqrt{n}\log n)\).

约数个数和

首先,你需要知道一个恒等式:

\[d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1] \]

证明:

\(i=\prod p_k^{\alpha_k},j=\prod p_k^{\beta_k}\),因此 $ij=\prod p_k^{\alpha_k+\beta_k} $
对于每一个因子,考虑贡献:左边产生的贡献为 \(\alpha_k+\beta_k+1\)(就是 \(d\) 函数的展开公式).
对于右边,需要钦定 \(x,y\) 其中一个的指数为 \(0\),再去除重复的 \((0,0)\),得出贡献为 \(\alpha_k+\beta_k+1\).
再将贡献乘起来就是左右两边的贡献,显然是相等的,故得证.

剩下的就比较简单了:

\[\begin{aligned} ans &=\sum_{i=1}^{n}\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\\ &=\sum_{i=1}^{n}\sum_{j=1}^m\sum_{x|i}\sum_{y|j}\sum_{d}[d|x][d|y]\mu(d)\\ &=\sum_{d}\mu(d)\sum_{i=1}^{n}\sum_{x|i}[d|x]\sum_{j=1}^m\sum_{y|j}[d|y]\\ &=\sum_{d}\mu(d)\sum_{i=1}^{n}d(\frac{i}{d})\sum_{j=1}^md(\frac{j}{d})\\ &=\sum_{d}\mu(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}d(i)\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}d(j)\\ \end{aligned} \]

\(f(n)=\sum_{i=1}^n d(n)\),有:

\[ans=\sum_{d}\mu(d)f(\left\lfloor\frac{n}{d}\right\rfloor)f(\left\lfloor\frac{m}{d}\right\rfloor) \]

使用整除分块求解.

Crash的数字表格

依据题意,写出下面的式子:

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

化简:

\[\begin{aligned} ans &=\sum_{i=1}^n\sum_{j=1}^m \operatorname{lcm}(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^m \frac{ij}{\gcd(i,j)}\\ &=\sum_{i=1}^n\sum_{j=1}^m\sum_{d}\frac{ij}{d}[\gcd(i,j)=d]\\ &=\sum_d\frac{1}{d}\sum_{i=1}^n\sum_{j=1}^mij[\gcd(i,j)=d]\\ &=\sum_d\frac{1}{d}\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}i\times d\times j\times d[\gcd(i,j)=1]\\ &=\sum_d d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}ij[\gcd(i,j)=1]\\ &=\sum_d d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}ij\sum_{k}[k|i][k|j]\mu(k)\\ &=\sum_d\sum_{k}\mu(k)d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}i[k|i]\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}j[k|j]\\ &=\sum_d\sum_{k}\mu(k)d\frac{(k+\left\lfloor\frac{n}{dk}\right\rfloor k)\left\lfloor\frac{n}{dk}\right\rfloor}{2}\frac{(k+\left\lfloor\frac{m}{dk}\right\rfloor k)\left\lfloor\frac{m}{dk}\right\rfloor}{2}\\ &=\sum_d\sum_{k}\mu(k)dk^2\frac{(1+\left\lfloor\frac{n}{dk}\right\rfloor)\left\lfloor\frac{n}{dk}\right\rfloor}{2}\frac{(1+\left\lfloor\frac{m}{dk}\right\rfloor)\left\lfloor\frac{m}{dk}\right\rfloor}{2}\\ &=\sum_T\sum_{k|T}\mu(k)kT\frac{(1+\left\lfloor\frac{n}{T}\right\rfloor)\left\lfloor\frac{n}{T}\right\rfloor}{2}\frac{(1+\left\lfloor\frac{m}{T}\right\rfloor)\left\lfloor\frac{m}{T}\right\rfloor}{2}\\ \end{aligned} \]

整除分块即可.

posted @ 2026-04-30 16:54  zhoumengxuan  阅读(1)  评论(0)    收藏  举报