链接
https://www.luogu.org/problem/show?pid=2522
题解
就是前一道题加上容斥。戳这
代码
//莫比乌斯反演
#include <cstdio>
#include <algorithm>
#define maxn 50001
using namespace std;
int mu[maxn], prime[maxn], mark[maxn], s[maxn];
void init()
{
int i, j;
mu[1]=1;
for(i=2;i<maxn;i++)
{
if(!mark[i])prime[++prime[0]]=i,mu[i]=-1;
for(j=1;j<=prime[0] and i*prime[j]<maxn;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
for(i=1;i<maxn;i++)s[i]=s[i-1]+mu[i];
}
int calc(int n ,int m)
{
int i, last, ans=0;
if(n>m)swap(n,m);
for(i=1;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=(s[last]-s[i-1])*(n/i)*(m/i);
}
return ans;
}
int main()
{
int T, a, b, c, d, k;
init();
for(scanf("%d",&T);T;T--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
a=(a-1)/k, b=b/k, c=(c-1)/k, d=d/k;
printf("%d\n",calc(b,d)-calc(a,d)-calc(c,b)+calc(a,c));
}
}