题目描述
设 d ( x ) d(x) d(x) 为 x x x 的约数个数,给定 n , m n,m n,m 求
∑ i = 1 n ∑ j = 1 m d ( i j ) \sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij) i=1∑nj=1∑md(ij)
引理:
d ( i j ) = ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] d(ij)=\sum\limits_{x|i}\sum\limits_{y|j}[gcd(x,y)=1] d(ij)=x∣i∑y∣j∑[gcd(x,y)=1]
证明:
对于
i
j
ij
ij 的某一个约数
s
=
p
1
c
1
p
2
c
2
.
.
.
p
k
c
k
s=p_1^{c_1}p_2^{c_2}...p_k^{c_k}
s=p1c1p2c2...pkck
对于
s
s
s 的某一个素因子
p
p
p 设其次数为
c
c
c,在
i
i
i 中次数为
a
a
a ,在
j
j
j 中次数为
b
b
b 。
- c ≤ a c\leq a c≤a,在 ( x , y ) = ( c , 0 ) (x,y)=(c,0) (x,y)=(c,0) 时,形成唯一映射
-
c
>
a
c>a
c>a,在
(
x
,
y
)
=
(
0
,
c
−
a
)
(x,y)=(0,c-a)
(x,y)=(0,c−a) 时,形成唯一映射
故有且仅有一组 ( x , y ) (x,y) (x,y) 与素因子 p p p 的次数对应
注意到 x , y x,y x,y 中至少有一个 0 0 0,所以用 g c d gcd gcd 来限制即可
解法
∑
i
=
1
n
∑
j
=
1
m
∑
x
∣
i
∑
y
∣
j
[
g
c
d
(
x
,
y
)
=
1
]
\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}[gcd(x,y)=1]
i=1∑nj=1∑mx∣i∑y∣j∑[gcd(x,y)=1]
∑
i
=
1
n
∑
j
=
1
m
∑
x
∣
i
∑
y
∣
j
∑
d
∣
x
,
d
∣
y
μ
(
d
)
\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d|x,d|y}\mu(d)
i=1∑nj=1∑mx∣i∑y∣j∑d∣x,d∣y∑μ(d)
∑
x
=
1
n
∑
y
=
1
m
⌊
n
x
⌋
⌊
m
y
⌋
∑
d
∣
x
,
d
∣
y
μ
(
d
)
\sum\limits_{x=1}^n\sum\limits_{y=1}^m\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\sum\limits_{d|x,d|y}\mu(d)
x=1∑ny=1∑m⌊xn⌋⌊ym⌋d∣x,d∣y∑μ(d)
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
∑
x
=
1
⌊
n
d
⌋
∑
y
=
1
⌊
m
d
⌋
⌊
n
d
x
⌋
⌊
m
d
y
⌋
\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{dx}\rfloor\lfloor\frac{m}{dy}\rfloor
d=1∑min(n,m)μ(d)x=1∑⌊dn⌋y=1∑⌊dm⌋⌊dxn⌋⌊dym⌋
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
(
∑
x
=
1
⌊
n
d
⌋
⌊
n
d
x
⌋
)
(
∑
y
=
1
⌊
m
d
⌋
⌊
m
d
y
⌋
)
\sum\limits_{d=1}^{min(n,m)}\mu(d)(\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{dx}\rfloor)(\sum\limits_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{dy}\rfloor)
d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊dxn⌋)(y=1∑⌊dm⌋⌊dym⌋)
令
f
(
x
)
=
∑
i
=
1
x
⌊
x
i
⌋
f(x)=\sum\limits_{i=1}^{x}\lfloor\frac{x}{i}\rfloor
f(x)=i=1∑x⌊ix⌋
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
(
∑
x
=
1
⌊
n
d
⌋
⌊
⌊
n
d
⌋
x
⌋
)
(
∑
y
=
1
⌊
m
d
⌋
⌊
⌊
m
d
⌋
y
⌋
)
\sum\limits_{d=1}^{min(n,m)}\mu(d)(\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{\lfloor\frac{n}{d}\rfloor}{x}\rfloor)(\sum\limits_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{\lfloor\frac{m}{d}\rfloor}{y}\rfloor)
d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊x⌊dn⌋⌋)(y=1∑⌊dm⌋⌊y⌊dm⌋⌋)
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
f
(
⌊
n
d
⌋
)
f
(
⌊
m
d
⌋
)
\sum\limits_{d=1}^{min(n,m)}\mu(d)f(\lfloor\frac{n}{d}\rfloor)f(\lfloor\frac{m}{d}\rfloor)
d=1∑min(n,m)μ(d)f(⌊dn⌋)f(⌊dm⌋)
到这里就可以直接对
d
d
d 数论分块。
算 f ( x ) f(x) f(x)可以用差分的思想,考虑 i i i 的贡献。
i
i
i 对
f
(
i
f(i
f(i ~
2
i
−
1
)
2i-1)
2i−1) 有
1
1
1 的贡献
对
f
(
2
i
f(2i
f(2i ~
3
i
−
1
)
3i-1)
3i−1) 有
2
2
2 的贡献
.
.
.
...
...
差分一下,给
f
(
k
i
)
+
=
1
f(ki)+=1
f(ki)+=1 ,对于
i
i
i 共进行了
n
i
\frac{n}{i}
in 次操作
复杂度 O ( n l n ) \mathcal O(nln) O(nln) 预处理即可。
代码:
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int P=50005;
int prime[P],pcnt;
bool vis[P];
int mu[P],sum[P],f[P];
void Init() {
sum[1]=mu[1]=1;
for(int i=2;i<P;i++) {
if(!vis[i]) mu[prime[++pcnt]=i]=-1;
for(int j=1;j<=pcnt&&i*prime[j]<P;j++) {
vis[i*prime[j]]=true;
if(i%prime[j]==0) break;
mu[i*prime[j]]=-mu[i];
}
sum[i]=sum[i-1]+mu[i];
}
for(int i=1;i<P;i++)
for(int j=i;j<P;j+=i)
f[j]++;
for(int i=1;i<P;i++)
f[i]+=f[i-1];
}
inline LL Solve(int A,int B) {
LL ret=0;
for(int l=1,r;l<=A;l=r+1) {
r=min(A/(A/l),B/(B/l));
ret=ret+1ll*(sum[r]-sum[l-1])*f[A/l]*f[B/l];
}
return ret;
}
int T,n,m;
int main() {
Init();
scanf("%d",&T);
for(int Cas=1;Cas<=T;Cas++) {
scanf("%d %d",&n,&m);
if(n>m) swap(n,m);
printf("%lld\n",Solve(n,m));
}
return 0;
}