莫比乌斯反演
引入
数据分块(整除分块)
对于 \(\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;
}
狄利克雷卷积
介绍函数 \(\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)\).