题目传送门
本题题意转化成为:
∑
x
=
a
b
∑
y
=
c
d
[
g
c
d
(
i
,
j
)
=
=
k
]
\displaystyle\sum_{x=a}^{b}\displaystyle\sum_{y=c}^{d}[ gcd(i,j)==k]
x=a∑by=c∑d[gcd(i,j)==k]
这道题应该就是比较基础了
容斥原理
∑
x
=
a
b
∑
y
=
c
d
[
g
c
d
(
i
,
j
)
=
=
k
]
=
∑
x
=
1
b
∑
y
=
1
d
[
g
c
d
(
i
,
j
)
=
=
k
]
−
∑
x
=
1
a
−
1
∑
y
=
1
d
[
g
c
d
(
i
,
j
)
=
=
k
]
−
∑
x
=
1
b
∑
y
=
1
c
−
1
[
g
c
d
(
i
,
j
)
=
=
k
]
+
∑
x
=
1
a
−
1
∑
y
=
1
c
−
1
[
g
c
d
(
i
,
j
)
=
=
k
]
\displaystyle\sum_{x=a}^{b}\displaystyle\sum_{y=c}^{d}[ gcd(i,j)==k] =\displaystyle\sum_{x=1}^{b}\displaystyle\sum_{y=1}^{d}[ gcd(i,j)==k]-\displaystyle\sum_{x=1}^{a-1}\displaystyle\sum_{y=1}^{d}[ gcd(i,j)==k]-\displaystyle\sum_{x=1}^{b}\displaystyle\sum_{y=1}^{c-1}[ gcd(i,j)==k]+\displaystyle\sum_{x=1}^{a-1}\displaystyle\sum_{y=1}^{c-1}[ gcd(i,j)==k]
x=a∑by=c∑d[gcd(i,j)==k]=x=1∑by=1∑d[gcd(i,j)==k]−x=1∑a−1y=1∑d[gcd(i,j)==k]−x=1∑by=1∑c−1[gcd(i,j)==k]+x=1∑a−1y=1∑c−1[gcd(i,j)==k]
也就是求四个这个东西的式子
∑
x
=
1
a
∑
y
=
1
b
[
g
c
d
(
x
,
y
)
=
=
k
]
\displaystyle\sum_{x=1}^{a}\displaystyle\sum_{y=1}^{b}[ gcd(x,y)==k]
x=1∑ay=1∑b[gcd(x,y)==k]
提取公因数
∑
x
=
1
a
/
k
∑
y
=
1
b
/
k
ε
(
g
c
d
(
x
,
y
)
)
\displaystyle\sum_{x=1}^{a/k}\displaystyle\sum_{y=1}^{b/k}ε(gcd(x,y))
x=1∑a/ky=1∑b/kε(gcd(x,y))
莫比乌斯函数
∑
x
=
1
a
/
k
∑
y
=
1
b
/
k
∑
d
∣
g
c
d
(
x
,
y
)
μ
(
d
)
\displaystyle\sum_{x=1}^{a/k}\displaystyle\sum_{y=1}^{b/k}\displaystyle\sum_{d|gcd(x,y)}^{}μ(d)
x=1∑a/ky=1∑b/kd∣gcd(x,y)∑μ(d)
交换枚举顺序
∑
d
=
1
d
<
=
m
i
n
(
a
/
k
,
b
/
k
)
μ
(
d
)
∑
x
=
1
a
/
(
k
∗
d
)
∑
y
=
1
b
/
(
k
∗
d
)
1
\displaystyle\sum_{d=1}^{d<=min(a/k,b/k)}μ(d)\displaystyle\sum_{x=1}^{a/(k*d)}\displaystyle\sum_{y=1}^{b/(k*d)}1
d=1∑d<=min(a/k,b/k)μ(d)x=1∑a/(k∗d)y=1∑b/(k∗d)1
∑
d
=
1
d
<
=
m
i
n
(
a
/
k
,
b
/
k
)
μ
(
d
)
∗
(
b
/
(
k
∗
d
)
)
∗
(
a
/
(
k
∗
d
)
)
\displaystyle\sum_{d=1}^{d<=min(a/k,b/k)}μ(d)*(b/(k*d))*(a/(k*d))
d=1∑d<=min(a/k,b/k)μ(d)∗(b/(k∗d))∗(a/(k∗d))
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 500000;
int mu[N + 5], p[N + 5];
bool flg[N + 5];
void mobius() {
int tot = 0;
mu[1] = 1;
for (int i = 2; i <= N; ++i) {
if (!flg[i]) {
p[++tot] = i;
mu[i] = -1;
}
for (int j = 1; j <= tot && i * p[j] <= N; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
//数论分块要用到的前缀和
for (int i = 1; i <= N; ++i) mu[i] += mu[i - 1];
}
int lsc(int n,int m){
int ans=0;
for(int i=1,j;i<=min(n,m);i=j+1){
j=min(n/(n/i),m/(m/i));
ans+=(mu[j]-mu[i-1])*(n/i)*(m/i);
}
return ans;
}
int main(){
mobius();
int T;
cin>>T;
while(T--){
int a,b,c,d,k;
cin>>a>>b>>c>>d>>k;
cout<<lsc(b/k,d/k)-lsc((a-1)/k,d/k)-lsc(b/k,(c-1)/k)+lsc((a-1)/k,(c-1)/k)<<endl;
}
}