莫比乌斯反演

引入

数据分块(整除分块)

对于 \(\left \lfloor \dfrac{n}{i} \right \rfloor (1\le i\le n)\),最多只有 \(2\sqrt{n}\) 种取值。
所以就可以打包计算。
以求 \(\sum n\mod i\) 为例:
由于 \(n=i\cdot k + r\)\(r\) 是余数,\(k\) 是商。
所以 \(\sum r=\sum (n-i\cdot k)\).
对于相同的商,打包计算。

code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,k,ans,l,r;
signed main() {
	cin>>n>>k;
	for(l=1; l<=n&&l<=k; ) {
		r=k/(k/l);
		if(r>n) r=n;
		ans=ans+k*(r-l+1)-(k/l)*(r+l)*(r-l+1)/2;
		l=r+1;
	}
	if(n>k) ans=ans+k*(n-k);
	cout<<ans<<endl;
	return 0;
}
复杂度 $O(\sqrt n)$
狄利克雷卷积

介绍函数 \(\epsilon(x)=[x=1]\).
函数 \(I(x)=1\).
函数 \(id(x)=x\)

卷积定义为 \(h(n)=f*g(n)=\sum_{d|n}f(d)*g(\frac{n}{d})\).
可以说 \(h=f*g\).
重要性质:若 \(f,g\) 都为积性函数,那么 \(h\) 也为积性函数。

我们发现 \(\epsilon\) 是单位元。
因为 \(f=f*\epsilon\).

莫比乌斯函数

定义如下:
\(x\) 分解因式为 \(x=p_1^{q1} p_2^{q2}...p_k^{qk}\).
\(x=1\),则 \(\mu(x)=1\)
\(q_1=q_2=..=q_k=1\),则 \(\mu(x)=(-1)^k\).
\(q\) 不全为 \(1\) ,则 \(\mu(x)=0\).
莫比乌斯函数是积性函数。

重要公式: \(\mu*I=\epsilon\)
\(\sum_{d|n}\mu(d)=[n=1]\).
可以用二项式定理证明。

所以反演的结论是 \(\sum_{d|i,j}\mu(d)=\epsilon(\gcd(i,j))=[\gcd(i,j)=1]\)

反演

\(f(n)=\sum_{d|n} g(d)\),则 \(g(n)=\sum_{d|n} \mu(d) f(\frac{n}{d})\).
证:若 \(F*I=G\),那么 \(F*I=G*\mu*I\),则 \(G=F*\mu\).

形式二:若 \(f(n)=\sum_{n|d} g(d)\),则 \(g(n)=\sum_{n|d} \mu(\frac{d}{n})f(d)\)
证:\(\sum_{n|d} \mu(\frac{d}{n})f(d)=\sum_k \mu(k)f(kn)\).
\(=\sum_k \mu(k) \sum_{kn|d} g(d)\)
\(=\sum_d g(d) \sum_{k|\frac{d}{n}}\mu(k)\)
\(=\sum_d g(d) \epsilon(\frac{d}{n})=g(n)\).

重要公式

\(\varphi * I = id\)
\(\mu * id = \varphi\)

应用

Luogu P3455 ZAP

为方便书写,\(n/d\)\(n\) 整除 \(d\).
题意:求多少个二元组 \((i,j),i\le n,j\le m\) 满足 \(gcd(i,j)=k\).

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

\(k\) 约掉

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

\(n=n/k,m=m/k\).

运用反演结论

\(=\sum_{i=1}^{n}\sum_{j=1}^m \sum_{d|gcd(i,j)}\mu(d)\)

\(d\) 提到前面

\(=\sum_{d=1}^n\mu(d)\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\)

\(=\sum_{d=1}^n\mu(d)\cdot n/d\cdot m/d\)

后面用整除分块,单次询问 \(O(\sqrt n)\).

code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N=5e4+10;
LL prime[N],tot,mu[N],s[N];
bool v[N];
LL n,m,d,p,q,g,ans;
int main() {
	s[1]=mu[1]=1;
	for(LL i=2; i<N; i++) {
		if(!v[i]) {prime[++tot]=i; mu[i]=-1;}
		s[i]=s[i-1]+mu[i];
		for(LL j=1; j<=tot&&i*prime[j]<N; j++) {
			v[i*prime[j]]=1;
			if(i%prime[j]==0) break;
			mu[i*prime[j]]=-mu[i];
		}
	}
	scanf("%lld",&g);
	for(; g; g--) {
		ans=0;
		scanf("%lld%lld%lld",&n,&m,&d);
		p=n/d; q=m/d;
		if(p>q) swap(p,q);
		for(int l=1,r; l<=p; l=r+1) {
			r=min(p/(p/l),q/(q/l));
			ans+=(s[r]-s[l-1])*(p/l)*(q/l);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
YY的GCD

题意:求多少个二元组 \((i,j),i\le n,j\le m\) 满足 \(gcd(i,j)=p,p\in prime\).

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

\(p\) 约掉

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

运用反演结论

\(\sum_{p\in prime}\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}\sum_{d|gcd(i,j)}\mu(d)\)

\(d\) 提到前面

\(\sum_{p\in prime}\sum_{d=1}^n \mu(d) \cdot n/dp \cdot m/dp\)

\(T=dp\).

\(\sum_{p\in prime}\sum_{d=1}^n \mu(T/p) \cdot n/T \cdot m/T\)

枚举 \(T\).

\(\sum_{T=1}^n \sum_{p\in prime,p|T} \mu(T/p) \cdot n/T \cdot m/T\)

预处理 \(f(T)=\sum_{p\in prime,p|T} \mu(T/p)\)

\(\sum_{T=1}^n f(T) \cdot n/T \cdot m/T\)

用整除分块完成。

至于如何处理 \(f(T)\) 函数呢,可以线性筛完成。

\(f(T)=\sum_{p\in prime,p|T} \mu(T/p)\)

\(f(x)\)\(i\) 推出,\(x=i\cdot y(y\in prime)\)

\(x\in prime\)\(f(x)=1\).

\(x \mod i=0\)\(f(x)=\mu(i)\).

\(x \mod i\not =0\)\(f(x)=-f(i)+\mu(i)\)

Luogu P4449 于神之怒加强版

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

枚举 \(gcd\)

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

化简

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

运用反演结论

\(\sum_{g=1}^n g^k \sum_{i=1}^{n/g} \sum_{j=1}^{m/g} \sum_{d|\gcd(i,j)}\mu(d)\)

枚举 \(d\)

\(\sum_{g=1}^n g^k \sum_{d=1}^n \mu(d) \sum_{i=1,d|i}^{n/g} \sum_{j=1,d|j}^{m/g}\)

化简

\(\sum_{g=1}^n g^k \sum_{d=1}^n \mu(d) \cdot n/dg \cdot m/dg\)

\(T=dg\),枚举 \(T\).

\(\sum_{T=1}^n n/T \cdot m/T\cdot\sum_{d|T} (T/d)^k \mu(d)\)

\(h(T)=\sum_{d|T} (T/d)^k \mu(d)\),根据卷积的性质, \(h(T)\) 为积性函数,
线性筛出即可。

\(T\) 质因数分解,\(T=p_1^{c1}...p_n^{cn}\)

\(h(T)=\prod_{p\in prime} h(p^c)\)

\(=\prod_{p\in prime} (\mu(p)\cdot(p^{c-1})^k+\mu(1)\cdot(p^c)^k)\)

这是因为只有 \(\mu(p),\mu(1)\) 有值。

线性筛即可。

P1829 [国家集训队] Crash的数字表格

题意:求 \(\sum_{i=1}^n \sum_{j=1}^m \dfrac{ij}{gcd(i,j)}\).

枚举 \(gcd\)

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

运用反演结论

\(\sum_{d=1}^n d \sum_{i=1}^{n/d} \sum_{j=1}^{m/d} ij \sum_{t|d}\mu(t)\)

枚举 \(t\),同时设 \(sum(i)=\dfrac{n(n+1)}{2}\).

$\sum_{d=1}^n d \sum_{t=1}^n \mu(t) \cdot t^2 \cdot sum(n/dt) \cdot sum(m/dt) $

\(T=dt\),并枚举 \(T\).

\(\sum_{T=1}^n sum(n/T)\cdot sum(m/T) \cdot T\sum_{t|T}t\mu(t)\).

\(f(T)=\sum_{t|T}t\mu(t)\).

考虑求 \(f(T)\),用线性筛。

\(T\) 现在被 \(p\) 这个质因子更新。

\(p|T\) ,由于 \(\mu(pT)\) 势必为 \(0\),所以对原式无影响,\(f(Tp)=f(T)\).

反之,此时其每个因子乘上 \(p\)\(\mu\) 的值乘上 \(-1\)\(f(Tp)=f(T)-pf(T)=(1-p)f(T)=f(p)f(T)\).

便做完了这题。

P3911 最小公倍数之和

先预处理出 \(c_i\) 表示 \(i\) 出现多少次,设 \(n\) 为出现的最大值。

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

同上题,

\(\sum_{T=1}^n (\sum_{i=1}^{n/T}i\cdot c_i)^2 \cdot T\sum_{t|T}t\mu(t)\).

posted @ 2023-03-28 21:02  s1monG  阅读(31)  评论(0编辑  收藏  举报