点此看题面
大致题意: 求
∑
x
=
1
N
∑
y
=
1
M
[
g
c
d
(
x
,
y
)
=
=
d
]
\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]
∑x=1N∑y=1M[gcd(x,y)==d]。
一道类似的题目
推荐先去做一下这道题:【洛谷2257】YY的GCD,来学习一下莫比乌斯反演。
再来看这题,就非常简单了。
L
i
n
k
Link
Link
莫比乌斯反演 详见博客 初学莫比乌斯反演
【洛谷2257】YY的GCD 的题解 详见博客 【洛谷2257】YY的GCD(莫比乌斯反演)
一些定义
按照上面提到的那题的思路,首先,我们可以定义
f
(
d
)
f(d)
f(d)和
F
(
d
)
F(d)
F(d)如下:
f
(
d
)
=
∑
i
=
1
N
∑
j
=
1
M
[
g
c
d
(
i
,
j
)
=
=
d
]
f(d)=\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)==d]
f(d)=i=1∑Nj=1∑M[gcd(i,j)==d]
F
(
d
)
=
∑
i
=
1
N
∑
j
=
1
M
[
d
∣
g
c
d
(
i
,
j
)
]
F(d)=\sum_{i=1}^N\sum_{j=1}^M[d|gcd(i,j)]
F(d)=i=1∑Nj=1∑M[d∣gcd(i,j)]
通过定义,不难发现:
F
(
n
)
=
∑
n
∣
d
f
(
d
)
=
⌊
N
n
⌋
⌊
M
n
⌋
F(n)=\sum_{n|d}f(d)=\lfloor\frac Nn\rfloor\lfloor\frac Mn\rfloor
F(n)=n∣d∑f(d)=⌊nN⌋⌊nM⌋
由于莫比乌斯反演的某些性质,我们又可以得到:
f
(
n
)
=
∑
n
∣
d
μ
(
⌊
d
n
⌋
)
F
(
d
)
f(n)=\sum_{n|d}\mu(\lfloor\frac dn\rfloor)F(d)
f(n)=n∣d∑μ(⌊nd⌋)F(d)
公式化简
我们应该不难想到:
a
n
s
w
e
r
=
f
(
d
)
answer=f(d)
answer=f(d)
貌似比 YY的GCD 简单了许多。
然后就是一波化简。
先来一波莫比乌斯反演:
a
n
s
w
e
r
=
∑
p
∣
d
μ
(
⌊
d
p
⌋
)
F
(
d
)
answer=\sum_{p|d}\mu(\lfloor\frac dp\rfloor)F(d)
answer=p∣d∑μ(⌊pd⌋)F(d)
但是,这样有点难以处理。
于是,我们改成枚举
⌊
d
p
⌋
\lfloor\frac dp\rfloor
⌊pd⌋,于是原式就变成了这样:
a
n
s
w
e
r
=
∑
p
=
1
m
i
n
(
⌊
N
d
⌋
,
⌊
M
d
⌋
)
μ
(
p
)
⌊
N
d
⋅
p
⌋
M
d
⋅
p
⌋
answer=\sum_{p=1}^{min(\lfloor\frac Nd\rfloor,\lfloor\frac Md\rfloor)}\mu(p)\lfloor\frac N{d·p}\rfloor\frac M{d·p}\rfloor
answer=p=1∑min(⌊dN⌋,⌊dM⌋)μ(p)⌊d⋅pN⌋d⋅pM⌋
这样就很容易求解了。
求解答案
不难想到,我们可以用除法分块。
不难发现,在一定范围内
⌊
N
i
⌋
\lfloor\frac Ni\rfloor
⌊iN⌋的值是保持不变的(
⌊
M
i
⌋
\lfloor\frac Mi\rfloor
⌊iM⌋同理),则
⌊
N
G
⌋
⌊
M
G
⌋
\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor
⌊GN⌋⌊GM⌋其实最多只有
N
+
M
\sqrt N+\sqrt M
N
+M
,而对于
⌊
N
G
⌋
⌊
M
G
⌋
\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor
⌊GN⌋⌊GM⌋相同的值,我们可以一起求解,于是就能想到用
s
u
m
i
sum_i
sumi来表示
∑
i
=
1
i
μ
(
i
)
\sum_{i=1}^i \mu(i)
∑i=1iμ(i),这样就能快速求解了。
代码
#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 50000
using namespace std
;
int n
,m
,k
;
class FIO
{
private:
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f
,FoutSize
,OutputTop
;char ch
,Fin
[Fsize
],*FinNow
,*FinEnd
,Fout
[Fsize
],OutputStack
[Fsize
];
public:
FIO() {FinNow
=FinEnd
=Fin
;}
inline void read(int &x
) {x
=0,f
=1;while(!isdigit(ch
=tc())) f
=ch
^'-'?1:-1;while(x
=ten(x
)+(ch
&15),isdigit(ch
=tc()));x
*=f
;}
inline void read_char(char &x
) {while(isspace(x
=tc()));}
inline void read_string(string
&x
) {x
="";while(isspace(ch
=tc()));while(x
+=ch
,!isspace(ch
=tc())) if(!~ch
) return;}
inline void write(LL x
) {if(!x
) return (void)pc('0');if(x
<0) pc('-'),x
=-x
;while(x
) OutputStack
[++OutputTop
]=x
%10+48,x
/=10;while(OutputTop
) pc(OutputStack
[OutputTop
]),--OutputTop
;}
inline void write_char(char x
) {pc(x
);}
inline void write_string(string x
) {register int i
,len
=x
.length();for(i
=0;i
<len
;++i
) pc(x
[i
]);}
inline void end() {fwrite(Fout
,1,FoutSize
,stdout);}
}F
;
class Class_Mobius
{
private:
int Prime_cnt
,mu
[N
+5],Prime
[N
+5];bool IsNotPrime
[N
+5];
public:
LL sum
[N
+5];
Class_Mobius()
{
register int i
,j
;
for(mu
[1]=1,i
=2;i
<=N
;++i
)
{
if(!IsNotPrime
[i
]) Prime
[++Prime_cnt
]=i
,mu
[i
]=-1;
for(j
=1;j
<=Prime_cnt
&&i
*Prime
[j
]<=N
;++j
)
if(IsNotPrime
[i
*Prime
[j
]]=true,i
%Prime
[j
]) mu
[i
*Prime
[j
]]=-mu
[i
];else break;
}
for(i
=1;i
<=N
;++i
) sum
[i
]=sum
[i
-1]+mu
[i
];
}
}Mobius
;
int main()
{
register int i
,nxt
,lim
,T
;register LL ans
;F
.read(T
);
while(T
--)
{
F
.read(n
),F
.read(m
),F
.read(k
),lim
=min(n
,m
)/k
;
for(ans
=0,i
=1;i
<=lim
;i
=nxt
+1) nxt
=min(n
/(n
/i
),m
/(m
/i
)),ans
+=1LL*(n
/(i
*k
))*(m
/(i
*k
))*(Mobius
.sum
[nxt
]-Mobius
.sum
[i
-1]);
F
.write(ans
),F
.write_char('\n');
}
return F
.end(),0;
}