前言
久仰其大名,近日学之,知不易。
引入
【BZOJ2820】 YY的GCD
给定 n , m n,m n,m,求 1 ≤ x ≤ n 1≤x≤n 1≤x≤n, 1 ≤ y ≤ m 1≤y≤m 1≤y≤m且 g c d ( x , y ) gcd(x,y) gcd(x,y)为质数的 ( x , y ) (x,y) (x,y)有多少对。
若暴力枚举之,时间复杂度过
θ
(
n
2
)
\theta(n^2)
θ(n2),附线性欧筛预处理,炸哉。
因不得使,习莫比乌斯反演,旋过之。
附代码
//恰同学少年,风华正茂;书生意气,挥斥方遒。
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
const int NN=1e7;
bool vis[N];
int sjs, p[N], miu[N], cnt, n, m;
long long F[N];
inline void init() {
memset(vis, 0, sizeof(vis));
int i, j; cnt=0;
//phi[1]=1;
miu[1]=1;
for(i=2; i<=NN; i++) {
if(!vis[i]) {
p[++cnt]=i;
miu[i]=-1;
//phi[i]=i-1;
}
for(j=1; j<=cnt&&i*p[j]<=NN; j++) {
vis[i*p[j]]=1;
if(i%p[j]==0) {
miu[i*p[j]]=0;
//phi[i*p[j]]=phi[i]*p[j];
break;
}
miu[i*p[j]]=-miu[i];
//phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
}
inline void getit() {
for(int i=1;i<=cnt;i++){
int p1=p[i];
for(int j=1;j*p1<=NN;j++) {
F[j*p1]+=miu[j];
}
}
for(int i=1; i<=NN; i++) {
F[i]+=F[i-1];
}
}
int main() {
init();
getit();
scanf("%d", &sjs);
while(sjs--) {
scanf("%d%d", &n, &m);
if(n>m) swap(n, m);
long long ans=0;
for(int i=1, j; i<=n; i=j+1) {
j=min(n/(n/i), m/(m/i));
ans+=(F[j]-F[i-1])*(n/i)*(m/i);
}
printf("%lld\n", ans);
}
}
简介
习此前,观一函数。
F
(
n
)
=
Σ
d
∣
n
f
(
d
)
F(n)=Σ_{d|n}f(d)
F(n)=Σd∣nf(d)
据此定义,便有
F
(
1
)
=
f
(
1
)
F(1)=f(1)
F(1)=f(1)
F
(
2
)
=
f
(
1
)
+
f
(
2
)
F(2)=f(1)+f(2)
F(2)=f(1)+f(2)
F
(
3
)
=
f
(
1
)
+
f
(
3
)
F(3)=f(1)+f(3)
F(3)=f(1)+f(3)
F
(
4
)
=
f
(
1
)
+
f
(
2
)
+
f
(
4
)
F(4)=f(1)+f(2)+f(4)
F(4)=f(1)+f(2)+f(4)
.
.
.
.
.
.
......
......
移项得
f
(
1
)
=
F
(
1
)
f(1)=F(1)
f(1)=F(1)
f
(
2
)
=
F
(
2
)
−
F
(
1
)
f(2)=F(2)-F(1)
f(2)=F(2)−F(1)
f
(
3
)
=
F
(
3
)
−
F
(
1
)
f(3)=F(3)-F(1)
f(3)=F(3)−F(1)
f
(
4
)
=
F
(
4
)
−
F
(
2
)
f(4)=F(4)-F(2)
f(4)=F(4)−F(2)
.
.
.
.
.
.
......
......
问君何所得?不过此公式矣。
F
(
n
)
=
Σ
d
∣
n
f
(
d
)
F(n)=Σ_{d|n}f(d)
F(n)=Σd∣nf(d)
=>
f
(
n
)
=
Σ
d
∣
n
μ
(
d
)
F
(
n
d
)
f(n)=Σ_{d|n}μ(d)F(\frac{n}{d})
f(n)=Σd∣nμ(d)F(dn)
此为莫比乌斯反演之基础变换。
莫比乌斯函数
问曰:“何为函数μ?”
答曰:“不过莫比乌斯函数矣。”
(我不想打LaTeX了)
此可线性推,详见代码。
欧拉函数
除变态
μ
μ
μ,还需要
φ
φ
φ函数即欧拉函数
在数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目
此同可线性推
基本公式
仅个人总结,如有误,欢迎提。
公式一
[
g
c
d
(
i
,
j
)
=
1
]
=
∑
d
∣
g
c
d
(
i
,
j
)
μ
(
d
)
[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d)
[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)
(因为
∑
d
∣
n
μ
(
d
)
=
[
n
=
1
]
\sum_{d|n}\mu(d)=[n=1]
∑d∣nμ(d)=[n=1])
公式二
∑
d
=
1
n
[
g
c
d
(
d
,
n
)
=
1
]
=
φ
(
n
)
∑_{d=1}^n[gcd(d, n)=1]=φ(n)
∑d=1n[gcd(d,n)=1]=φ(n)
(根据定义)
∑ ∑ ∑提、代之公式则不言矣。
解题基本步骤
同样仅个人总结
1.列公式
2.推公式
3.推标准函数
4.推自定函数
F
(
x
)
F(x)
F(x)
5.证明
F
(
x
)
F(x)
F(x)可乘。
后记
多做题,则知其术之妙。