题目描述
给出 N N N,统计满足下面条件的数对 ( a , b ) (a,b) (a,b)的个数:
- 1 ≤ a < b ≤ N 1\le a<b\le N 1≤a<b≤N
- a + b a+b a+b整除 a × b a×b a×b
输入输出格式
输入格式
一行一个数 N N N
输出格式
一行一个数表示答案
思路讲解
比较好的莫比乌斯反演题了。
ans
=
∑
a
=
1
N
∑
b
=
a
+
1
N
[
(
a
+
b
)
∣
a
b
]
\text{ans}=\sum_{a=1}^N\sum_{b=a+1}^{N}[(a+b)|ab]
ans=a=1∑Nb=a+1∑N[(a+b)∣ab]
考虑到令:
d
=
(
a
,
b
)
,
a
=
i
⋅
d
,
b
=
j
⋅
d
d=(a,b),\ a=i\cdot d,\ b=j\cdot d
d=(a,b), a=i⋅d, b=j⋅d
(
i
d
+
j
d
)
∣
i
j
d
2
⇔
d
(
i
+
j
)
∣
i
j
d
2
⇔
(
i
+
j
)
∣
i
j
d
(id+jd)|ijd^2⇔d(i+j)|ijd^2⇔(i+j)|ijd
(id+jd)∣ijd2⇔d(i+j)∣ijd2⇔(i+j)∣ijd
又有
(
i
+
j
,
i
j
)
=
1
(i+j,ij)=1
(i+j,ij)=1,所以只能有:
(
i
+
j
)
∣
d
(i+j)|d
(i+j)∣d
给出合法的
(
i
,
j
)
(i,j)
(i,j),求出满足条件的
d
d
d的个数。
=
∑
i
=
1
N
∑
j
=
i
+
1
N
[
(
i
,
j
)
=
1
]
⌊
n
j
(
i
+
j
)
⌋
=\sum_{i=1}^{\sqrt{N}}\sum_{j=i+1}^{\sqrt{N}}[(i,j)=1]\left\lfloor\frac{n}{j(i+j)}\right\rfloor
=i=1∑Nj=i+1∑N[(i,j)=1]⌊j(i+j)n⌋
不难想到反演:
=
∑
i
=
1
N
∑
j
=
1
N
∑
δ
∣
(
i
,
j
)
μ
(
δ
)
⌊
n
j
(
i
+
j
)
⌋
=\sum_{i=1}^{\sqrt{N}}\sum_{j=1}^{\sqrt{N}}\sum_{\delta|(i,j)}μ(\delta)\left\lfloor\frac{n}{j(i+j)}\right\rfloor
=i=1∑Nj=1∑Nδ∣(i,j)∑μ(δ)⌊j(i+j)n⌋
将
μ
(
δ
)
μ(\delta)
μ(δ)的和式提前:
=
∑
δ
=
1
N
μ
(
δ
)
∑
i
=
1
⌊
N
δ
⌋
∑
j
=
i
+
1
⌊
N
δ
⌋
⌊
N
δ
2
j
(
i
+
j
)
⌋
=\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{i=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{j=i+1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\left\lfloor\frac{N}{\delta^2j(i+j)}\right\rfloor
=δ=1∑Nμ(δ)i=1∑⌊δN⌋j=i+1∑⌊δN⌋⌊δ2j(i+j)N⌋
=
∑
δ
=
1
N
μ
(
δ
)
∑
i
=
1
⌊
N
δ
⌋
∑
j
=
i
+
1
⌊
N
δ
⌋
⌊
⌊
N
j
δ
2
⌋
i
+
j
⌋
=\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{i=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{j=i+1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\left\lfloor\frac{\left\lfloor\frac{N}{j\delta^2}\right\rfloor}{i+j}\right\rfloor
=δ=1∑Nμ(δ)i=1∑⌊δN⌋j=i+1∑⌊δN⌋⎣⎢⎢⎢i+j⌊jδ2N⌋⎦⎥⎥⎥
这个算法是正确的,但仍需要优化。
可以令
α
=
i
+
j
\alpha=i+j
α=i+j:
=
∑
δ
=
1
N
μ
(
δ
)
∑
j
=
1
⌊
N
δ
⌋
∑
α
=
j
+
1
2
j
−
1
⌊
⌊
N
j
δ
2
⌋
α
⌋
=\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{j=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{\alpha=j+1}^{2j-1}\left\lfloor\frac{\left\lfloor\frac{N}{j\delta^2}\right\rfloor}{\alpha}\right\rfloor
=δ=1∑Nμ(δ)j=1∑⌊δN⌋α=j+1∑2j−1⎣⎢⎢⎢α⌊jδ2N⌋⎦⎥⎥⎥
先预处理莫比乌斯函数,后面就是个分块了。
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e+5 + 1;
typedef long long ll;
int n, m, tot, Mu[N], P[N];
bool flag[N];
ll ans;
void sieve() {
Mu[1] = 1;
for(int i = 2; i <= m; i++) {
if(!flag[i]) P[++tot] = i, Mu[i] = -1;
for(int j = 1; j <= tot; j++) {
if(i * P[j] > m) break;
flag[i * P[j]] = 1;
Mu[i * P[j]] = -Mu[i];
if(i % P[j] == 0) {Mu[i * P[j]] = 0; break;}
}
}
}
ll L(int x, int y) {
ll res = 0; int z = x << 1;
if(!y) return 0;
for(int l = x + 1, r; l < z; l = r + 1) {
if(!(y / l)) return res;
r = min(y / (y / l), z - 1);
res += (r - l + 1) * (y / l);
}
return res;
}
int main()
{
scanf("%d", &n);
m = sqrt(n);
sieve();
for(int k = 1; k <= m; k++) {
if(!Mu[k]) continue;
for(int x = 1; x * k <= m; x++)
ans += Mu[k] * L(x, n / (x * k * k));
}
printf("%lld", ans);
return 0;
}