Solution
题目要求:
∑x=ab∑y=cd[gcd(x,y)=d]
∑
x
=
a
b
∑
y
=
c
d
[
g
c
d
(
x
,
y
)
=
d
]
就是BZOJ 1101 Zap套一个容斥就好了
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
int t,a,b,c,d,k;
int mu[N],pri[N],sum[N],tot;
bool mark[N];
void get() {
mu[1]=1;
for(int i=2;i<=50000;++i) {
if(!mark[i]) {
pri[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot && pri[j]*i<=50000;++j) {
mark[i*pri[j]]=1;
if(i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
for(int i=1;i<=50000;++i)
sum[i]=sum[i-1]+mu[i];
}
int cal(int a,int b) {
if(a>b) swap(a,b);
int pos=0,ans=0;
for(int i=1;i<=a;i=pos+1) {
pos=min((a/(a/i)),(b/(b/i)));
ans+=(sum[pos]-sum[i-1])*(a/i)*(b/i);
}
return ans;
}
int main() {
get();
scanf("%d",&t);
int ans=0;
while(t--) {
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
a=(a-1)/k;c=(c-1)/k;
b/=k;d/=k;
ans=cal(b,d)-cal(a,d)-cal(b,c)+cal(a,c);
printf("%d\n",ans);
}
return 0;
}