题目大意:求解两范围内的最大公约数为k的种类数,1 2,2 1为1种。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<queue>
#define ll __int64
#define inf 1000010+10
#define MAX 1000010
bool vis[1000010];
ll mup[1000010];
ll prime[1000010];
ll mu[1000010];
using namespace std;
void mobus()
{
memset(vis,false,sizeof(vis));
mu[1]=1;
int s=0;
for(int i=2;i<=1000000;i++)
{
if(!vis[i])
{
prime[s++]=i;
mu[i]=-1;
}
for(int j=0;j<s&&prime[j]*i<=1000010;j++)
{
vis[prime[j]*i ]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;break;
}
else
{
mu[i*prime[j] ]=-mu[i];
}
}
}
}
int main()
{
ll n,m,i,j,a1,b1,c1,d1,k1,a,b,c,d,k;
mobus();
int cla;
scanf("%d",&cla);
for(int gr=1;gr<=cla;gr++)
{
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
//scanf("%lld%lld%lld%lld%lld",&a2,&b2,&c2,&d2,&k2);
if(!k)
{
printf("Case %d: 0\n",gr);continue;
}
b/=k;
d/=k;
if(b>d)
swap(b,d);
ll ans=0;
for(int i=1;i<=b;i++)
ans+=mu[i]*(b/i)*(d/i);
long long ans2=0;
for(int i=1;i<=b;i++)
ans2+=mu[i]*(b/i)*(b/i);
ans-=ans2/2;
printf("Case %d: %I64d\n",gr,ans);
}
return 0;
}