一道数论好题(突然发现我还没写莫比乌斯反演的博客,先挖个坑吧。。)
题目描述
给出N,统计满足下面条件的数对(a,b)的个数:
1
≤
a
<
b
≤
N
1
≤
a
<
b
≤
N
1\le a<b \le N1≤a<b≤N
1≤a<b≤N1≤a<b≤N
a
+
b
a+b
a+b整除
a
×
b
a\times b
a×b
输入格式
一行一个数 N N N
输出格式
一行一个数表示答案
输入输出样例
输入 #1
15
输出 #1
4
题目解析
首先,这题我在刷数学题的时候看到过(确信)。。。。
所以这题是数竟题 ,不过当时数学书上N只有50,并且要写出所有解,并且数学书上的计算方法是O(
N
2
N^2
N2)的(因为口算时人脑对于一些枚举和为k的互质的一对数的过程计算起来更快,所以比单纯枚举要快)。
好了进入正题,根据数学书上写的:
设
k
=
g
c
d
(
a
,
b
)
,
a
=
k
x
,
b
=
k
y
k=gcd(a,b),a=kx,b=ky
k=gcd(a,b),a=kx,b=ky
那么
(
a
+
b
)
∣
a
b
⟹
(
x
+
y
)
∣
k
x
y
(a+b)|ab⟹(x+y)|kxy
(a+b)∣ab⟹(x+y)∣kxy
又
g
c
d
(
x
,
y
,
k
)
=
1
gcd(x,y,k)=1
gcd(x,y,k)=1
易知
g
c
d
(
x
+
y
,
x
y
)
=
1
⟹
(
x
+
y
)
!
∣
x
y
gcd(x+y,xy)=1 ⟹ (x+y)!|xy
gcd(x+y,xy)=1⟹(x+y)!∣xy
所以
(
x
+
y
)
∣
k
(x+y)|k
(x+y)∣k
然后数学书上就开始枚举
k
k
k了。。。
但是OI很神奇,所以我们接下来继续推式子
a n s = ∑ x = 1 n ∑ y = x + 1 n [ g c d ( x , y ) = = 1 ] ⌊ n m a x ( x , y ) ( x + y ) ⌋ ans=\sum^{n}_{x=1}\sum^{n}_{y=x+1}[gcd(x,y)==1]\lfloor\frac{n}{max(x,y)(x+y)}\rfloor ans=x=1∑ny=x+1∑n[gcd(x,y)==1]⌊max(x,y)(x+y)n⌋
关于
⌊
n
m
a
x
(
x
,
y
)
(
x
+
y
)
⌋
\lfloor\frac{n}{max(x,y)(x+y)}\rfloor
⌊max(x,y)(x+y)n⌋感性理解 ,是因为
1
≤
k
≤
n
m
a
x
(
x
,
y
)
(
x
+
y
)
1\le k\le \frac{n}{max(x,y)(x+y)}
1≤k≤max(x,y)(x+y)n,
k
∈
N
k\in N
k∈N所以
k
k
k一共有
⌊
n
m
a
x
(
x
,
y
)
(
x
+
y
)
⌋
\lfloor\frac{n}{max(x,y)(x+y)}\rfloor
⌊max(x,y)(x+y)n⌋种取值。
然后因为
y
>
x
,
x
+
y
≤
k
y>x,x+y\le k
y>x,x+y≤k
所以
y
2
<
y
(
x
+
y
)
≤
k
y
=
b
≤
n
y^2<y(x+y)\le ky=b\le n
y2<y(x+y)≤ky=b≤n
所以
y
<
n
y<\sqrt{n}
y<n
a
n
s
=
∑
x
=
1
n
∑
y
=
x
+
1
n
[
g
c
d
(
x
,
y
)
=
=
1
]
⌊
n
m
a
x
(
x
,
y
)
(
x
+
y
)
⌋
ans=\sum^{\sqrt{n}}_{x=1}\sum^{\sqrt{n}}_{y=x+1}[gcd(x,y)==1]\lfloor\frac{n}{max(x,y)(x+y)}\rfloor
ans=x=1∑ny=x+1∑n[gcd(x,y)==1]⌊max(x,y)(x+y)n⌋
然后我们就得到了优秀的
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)的算法
之后的过程开始加速毒瘤化(莫比乌斯反演),带好护目镜。
因为
[
x
=
=
1
]
=
e
(
x
)
=
∑
d
∣
x
μ
(
d
)
[x==1]=e(x)=\sum_{d|x}\mu(d)
[x==1]=e(x)=d∣x∑μ(d)
所以!!
a
n
s
=
∑
x
=
1
n
∑
y
=
x
+
1
n
⌊
n
m
a
x
(
x
,
y
)
(
x
+
y
)
⌋
∑
d
∣
g
c
d
(
x
,
y
)
μ
(
d
)
ans=\sum^{\sqrt{n}}_{x=1}\sum^{\sqrt{n}}_{y=x+1}\lfloor\frac{n}{max(x,y)(x+y)}\rfloor\sum_{d|gcd(x,y)}\mu(d)
ans=x=1∑ny=x+1∑n⌊max(x,y)(x+y)n⌋d∣gcd(x,y)∑μ(d)
把最后一个
∑
\sum
∑掉换到前面
a
n
s
=
∑
σ
=
1
n
μ
(
σ
)
∑
x
=
1
n
σ
∑
y
=
x
+
1
n
σ
⌊
n
σ
2
y
(
x
+
y
)
⌋
ans=\sum^{\sqrt{n}}_{\sigma=1}\mu(\sigma)\sum^{\frac{\sqrt{n}}{\sigma}}_{x=1}\sum^{\frac{\sqrt{n}}{\sigma}}_{y=x+1}\lfloor\frac{n}{\sigma^2y(x+y)}\rfloor
ans=σ=1∑nμ(σ)x=1∑σny=x+1∑σn⌊σ2y(x+y)n⌋
但是这里的复杂度就很迷模,这里运用调和求和法(详见具体数学)
H
^
=
n
1
+
n
2
+
n
3
+
.
.
.
.
.
.
+
n
n
=
l
o
g
e
n
+
γ
+
O
(
1
n
)
\hat{H}=\frac{\sqrt{n}}{1}+\frac{\sqrt{n}}{2}+\frac{\sqrt{n}}{3}+......+\frac{\sqrt{n}}{\sqrt{n}}=log_e{n}+\gamma+O(\frac{1}{n})
H^=1n+2n+3n+......+nn=logen+γ+O(n1)
这里的
γ
\gamma
γ是欧拉常数,所以复杂度为
O
(
n
l
o
g
2
n
)
O(\sqrt{n}log^2n)
O(nlog2n),简直是快飞了,但是还是可以考虑优化,设
z
=
x
+
y
z=x+y
z=x+y(因为很容易发现对于
x
x
x的枚举并没啥用)
a
n
s
=
∑
σ
=
1
n
μ
(
σ
)
∑
y
=
1
n
σ
∑
z
=
y
+
1
2
y
−
1
⌊
n
σ
2
y
z
⌋
ans=\sum^{\sqrt{n}}_{\sigma=1}\mu(\sigma)\sum^{\frac{\sqrt{n}}{\sigma}}_{y=1}\sum^{2y-1}_{z=y+1}\lfloor\frac{n}{\sigma^2yz}\rfloor
ans=σ=1∑nμ(σ)y=1∑σnz=y+1∑2y−1⌊σ2yzn⌋
这里同样用调和级数计算时间复杂度得到
O
(
n
l
o
g
n
)
O(\sqrt{n}logn)
O(nlogn),然后就A掉啦!!