Part 1 gcd,lcm \text{Part 1 gcd,lcm} Part 1 gcd,lcm
gcd ( x , y ) \gcd(x,y) gcd(x,y)表示 x , y x,y x,y的最大公约数,代码实现:
int gcd(int x,int y){return y?gcd(y,x%y):x;}
从代码中可以发现,每次 x , y x,y x,y中有一个数至少减了一半,所以时间复杂度为 Θ ( log min ( x , y ) ) \Theta(\log \min(x,y)) Θ(logmin(x,y))
lcm
(
x
,
y
)
\text{lcm}(x,y)
lcm(x,y)表示
x
,
y
x,y
x,y的最小公倍数
lcm
(
x
,
y
)
=
x
×
y
gcd
(
x
,
y
)
\text{lcm}(x,y)=\frac{x\times y}{\gcd(x,y)}
lcm(x,y)=gcd(x,y)x×y
即
lcm
(
x
,
y
)
×
gcd
(
x
,
y
)
=
x
×
y
\text{lcm}(x,y)\times \gcd(x,y)=x\times y
lcm(x,y)×gcd(x,y)=x×y
Part 2 exgcd \text{Part 2 exgcd} Part 2 exgcd
( 1 ) (1) (1)贝祖定理:对于给定的正整数 a , b a,b a,b,关于 x , y x,y x,y的方程 a x + b y = c ax+by=c ax+by=c有整数解的充要条件是 c c c是 gcd ( a , b ) \gcd(a,b) gcd(a,b)的整数倍。
( 2 ) exgcd (2)\text{exgcd} (2)exgcd正是贝祖定理中方程的解。
( 3 ) (3) (3)我们发现每次递归的时候 x = y 1 , y = x 1 − ⌊ a / b ⌋ × y 1 x=y1,y=x1-\lfloor a/b\rfloor\times y1 x=y1,y=x1−⌊a/b⌋×y1,而当递归的 y = 0 y=0 y=0的时候易得该方程的一组解是 x = 0 , y = 1 x=0,y=1 x=0,y=1,然后逐层回溯得到其它解。
代码实现:
void exgcd(int a,int b)
{
if (b==0){x=1,y=0;return;}
exgcd(b,a%b);
int t=x;
x=y;
y=t-(a/b)*y;
}
注意,此处的 x , y x,y x,y是全局变量。
Part 3 \text{Part 3 } Part 3 莫比乌斯函数、反演
(
1
)
(1)
(1)莫比乌斯函数表示为
μ
(
i
)
\mu(i)
μ(i),函数值:
μ
(
n
)
=
{
1
(
n
=
1
)
(
−
1
)
k
∀
v
p
(
n
)
≤
2
0
∃
v
p
(
n
)
>
2
\mu(n)=\left\{ \begin{aligned} \text{1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }(n=1)\\ (-1)^k\text{\ \ \ \ \ \ \ \ \ \ \ \ \ }\forall v_p(n)\le 2 \\ 0\text{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\exists v_p(n)>2 \end{aligned} \right.
μ(n)=⎩⎪⎨⎪⎧1 (n=1)(−1)k ∀vp(n)≤20 ∃vp(n)>2
(
2
)
(2)
(2)性质:
∑
d
∣
n
μ
(
d
)
=
[
n
=
1
]
\sum_{d|n}\mu(d)=[n=1]
d∣n∑μ(d)=[n=1]
(
3
)
(3)
(3)筛前缀和:欧拉筛
(
(
(时间复杂度
Θ
(
n
)
)
\Theta(n))
Θ(n))、杜教筛
(
(
(时间复杂度
Θ
(
n
2
3
)
)
\Theta(n^\frac 2 3))
Θ(n32))
代码 ( ( (欧拉筛 ) ) ):
for (int i=2;i<=n;++i)
{
if (!bz[i]) prime[++tot]=i,mu[i]=-1;
for (int j=1;j<=tot && i*prime[j]<=n;++j)
{
bz[i*prime[j]]=1;
if (i%prime[j]==0{mu[i*prime[j]]=0;break;}
mu[i*prime[j]]=-mu[i];
}
}
for (int i=1;i<=n;++i) sum[i]=sum[i-1]+mu[i];
代码 ( ( (杜教筛 ) ) ):
int S(int x)
{
if (x<N) return mu[x];
if (sum[x]) return sum[x];
int o=1;
for (int i=2,lt;i<=x;i=lt+1) lt=x/(x/i),o-=(lt-i+1)*S(x/i);
sum[x]=o;
return o;
}
(
4
)
(4)
(4)莫比乌斯反演定理:若
F
(
n
)
,
f
(
n
)
F(n),f(n)
F(n),f(n)为算数函数且满足
F
(
n
)
=
∑
d
∣
n
f
(
n
)
F(n)=\sum_{d|n}f(n)
F(n)=d∣n∑f(n)
则有
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
F
(
n
d
)
=
∑
d
∣
n
μ
(
n
d
)
F
(
d
)
f(n)=\sum_{d|n}\mu(d)F(\frac n d)=\sum_{d|n}\mu(\frac n d)F(d)
f(n)=d∣n∑μ(d)F(dn)=d∣n∑μ(dn)F(d)
(
5
)
(5)
(5)较常见的莫比乌斯反演
∑
i
=
1
n
∑
j
=
1
m
[
gcd
(
i
,
j
)
=
k
]
\large{\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=k]}
i=1∑nj=1∑m[gcd(i,j)=k]
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
[
gcd
(
i
,
j
)
=
1
]
\large{\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}[\gcd(i,j)=1]}
i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
∑
d
∣
gcd
(
i
,
j
)
μ
(
d
)
\large{\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}\sum_{d|\gcd(i,j)}\mu(d)}
i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)
∑
d
=
1
min
μ
(
d
)
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
1
\large{\sum_{d=1}^{\min}\mu(d)\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}1}
d=1∑minμ(d)i=1∑⌊kn⌋j=1∑⌊km⌋1
∑
d
=
1
min
μ
(
d
)
⌊
n
k
⌋
⌊
m
k
⌋
\large{\sum_{d=1}^{\min}\mu(d)\lfloor \frac n k\rfloor\lfloor \frac m k\rfloor}
d=1∑minμ(d)⌊kn⌋⌊km⌋
μ
(
d
)
\mu(d)
μ(d)的前缀和可以欧拉筛、杜教筛随便乱搞,
⌊
n
k
⌋
⌊
m
k
⌋
\lfloor \frac n k\rfloor\lfloor \frac m k\rfloor
⌊kn⌋⌊km⌋随便数论分块一下就行了,时间复杂度
Θ
(
n
+
n
)
\Theta(n+\sqrt n)
Θ(n+n)或
Θ
(
n
2
3
+
n
)
\Theta(n^{\frac 2 3}+\sqrt n)
Θ(n32+n)
(
6
)
(6)
(6)用
μ
\mu
μ的前缀和求
φ
\varphi
φ的前缀和:
∑
i
=
1
n
φ
(
i
)
\large\sum_{i=1}^{n}\varphi(i)
i=1∑nφ(i)
∑
i
=
1
n
∑
j
=
1
i
−
1
[
gcd
(
i
,
j
)
=
1
]
\large\sum_{i=1}^{n}\sum_{j=1}^{i-1}[\gcd(i,j)=1]
i=1∑nj=1∑i−1[gcd(i,j)=1]
∑
i
=
1
n
∑
j
=
1
n
[
gcd
(
i
,
j
)
=
1
]
2
\large\frac{\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=1]}{2}
2∑i=1n∑j=1n[gcd(i,j)=1]
为了方便先单独挑出分子进行分解
∑
i
=
1
n
∑
j
=
1
n
[
gcd
(
i
,
j
)
=
1
]
\large\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=1]
i=1∑nj=1∑n[gcd(i,j)=1]
∑
i
=
1
n
∑
j
=
1
n
∑
d
∣
gcd
(
i
,
j
)
μ
(
d
)
\large\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{d|\gcd(i,j)}\mu(d)
i=1∑nj=1∑nd∣gcd(i,j)∑μ(d)
∑
d
=
1
n
μ
(
d
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
n
d
⌋
1
\large\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{\lfloor \frac n d\rfloor}\sum_{j=1}^{\lfloor \frac n d\rfloor}1
d=1∑nμ(d)i=1∑⌊dn⌋j=1∑⌊dn⌋1
∑
d
=
1
n
μ
(
d
)
⌊
n
d
⌋
2
\large\sum_{d=1}^{n}\mu(d){\lfloor \frac n d\rfloor}^2
d=1∑nμ(d)⌊dn⌋2
所以
∑
i
=
1
n
φ
(
i
)
=
∑
d
=
1
n
μ
(
d
)
⌊
n
d
⌋
2
2
\large\sum_{i=1}^{n}\varphi(i)=\frac{\sum_{d=1}^{n}\mu(d){\lfloor \frac n d\rfloor}^2}{2}
i=1∑nφ(i)=2∑d=1nμ(d)⌊dn⌋2
μ
(
d
)
\mu(d)
μ(d)用欧拉筛、杜教筛照搞,后面照样数论分块,时间复杂度
Θ
(
n
+
n
)
\Theta(n+\sqrt n)
Θ(n+n)或
Θ
(
n
2
3
+
n
)
\Theta(n^{\frac 2 3}+\sqrt n)
Θ(n32+n)
剩余待更 . . . . . . ...... ......