题目
∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = = k ] \sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)==k] i=1∑nj=1∑m[gcd(i,j)==k]
题解
莫反入坑作
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
=
k
]
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
[
g
c
d
(
i
,
j
)
=
=
1
]
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
∑
d
∣
g
c
d
(
i
,
j
)
μ
(
d
)
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
∑
i
=
1
⌊
n
k
d
⌋
∑
i
=
1
⌊
m
k
d
⌋
1
∑
d
=
1
m
i
n
(
n
,
m
)
μ
(
d
)
⌊
n
k
d
⌋
⌊
m
k
d
⌋
\sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)==k]\\ \sum_{i=1}^{\lfloor \frac n k\rfloor } \sum_{j=1}^{\lfloor \frac m k\rfloor }[gcd(i,j)==1]\\ \sum_{i=1}^{\lfloor \frac n k\rfloor } \sum_{j=1}^{\lfloor \frac m k\rfloor }\sum_{d\mid gcd(i,j)}\mu(d)\\ \sum_{d=1}^{min(n,m)}\mu(d)\sum_{i=1}^{\lfloor \frac n {kd}\rfloor }\sum_{i=1}^{\lfloor \frac m {kd}\rfloor } 1\\ \sum_{d=1}^{min(n,m)}\mu(d){\lfloor \frac n {kd}\rfloor }{\lfloor \frac m {kd}\rfloor }\\
i=1∑nj=1∑m[gcd(i,j)==k]i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)==1]i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)d=1∑min(n,m)μ(d)i=1∑⌊kdn⌋i=1∑⌊kdm⌋1d=1∑min(n,m)μ(d)⌊kdn⌋⌊kdm⌋
两个向下取整版的整除分块,收工
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10,M=5e4;
int miu[N];
int z[N],p;
bool vis[N];
void Sieve()
{
miu[1]=1;
for(int i=2;i<=M;i++)
{
if(!vis[i])z[++p]=i,miu[i]=-1;
for(int j=1;j<=p&&i*z[j]<=M;j++)
{
vis[i*z[j]]=1;
if(i%z[j]==0)break;
miu[i*z[j]]=-miu[i];
}
}
for(int i=1;i<=M;i++)miu[i]+=miu[i-1];
}
int a[N],at;
int work(int n,int m)
{
int ans=0,up=min(n,m);
for(int l=1,r;l<=up;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(miu[r]-miu[l-1])*(n/l)*(m/l);
}return ans;
}
int main()
{
int T;
scanf("%d",&T);
Sieve();
while(T--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
n/=k;m/=k;
printf("%d\n",work(n,m));
}
}