#include<bits/stdc++.h>
using namespace std;
int u[100005],prime[100005],tp;
bool b[100005];
void get_u(){
u[1]=1;
for(int i=2;i<=100000;++i){
if(!b[i]) prime[++tp]=i,u[i]=-1;
for(int j=1;j<=tp && i*prime[j]<=100000;++j){
b[i*prime[j]]=true;
if(i%prime[j]==0) break;
u[i*prime[j]]=-u[i];
}
}
for(int i=1;i<=100000;++i) u[i]+=u[i-1];
}
long long calc(int n,int m,int k){
n/=k; m/=k;
int pre;
long long re=0;
for(int i=1;i<=n && i<=m;i=pre+1){
pre=min(n/(n/i),m/(m/i));
re+=1ll*(n/i)*(m/i)*(u[pre]-u[i-1]);
}
return re;
}
int main(){
int n;
scanf("%d",&n);
get_u();
while(n--){
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%lld\n",calc(b,d,k)+calc(a-1,c-1,k)-calc(a-1,d,k)-calc(b,c-1,k));
}
return 0;
}
【bzoj 2301】Problem b(莫比乌斯反演)
最新推荐文章于 2020-04-25 16:09:34 发布