https://blog.csdn.net/Let_life_stop/article/details/84843854
https://blog.csdn.net/qq_20200047/article/details/71091339
利用两个函数的关系,已知一个,可以求出另一个。具体内容参考大佬博客。
#include<iostream>
#include<stdio.h>
#include<map>
#include<cmath>
#include<string.h>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
bool isprime[1000006];
int prime[1000006],mu[1000006],cnt;
void chech()
{
mu[1]=1;
for(int i=2; i<1000006; i++)
{
if(isprime[i]==0)
{
mu[i]=-1;
prime[cnt++]=i;
}
for(int j=0; j<cnt&&i*prime[j]<1000006; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}//线性素数筛求莫比乌斯函数
ll top;
int main()
{
chech();
ll n,x1,y1,x2,y2,d;
scanf("%lld",&n);
while(n--)
{
scanf("%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&d);
if(d==0)
{
printf("Case %lld: 0\n",++top);
continue;
}
x1/=d,x2/=d,y1/=d,y2/=d;
ll sum=0,ans=0;
ll minx=min(y1,y2);
for(int i=1; i<=minx; i++)
{
sum+=mu[i]*(y1/i)*(y2/i);
ans+=mu[i]*(minx/i)*(minx/i);
}
printf("Case %lld: %lld\n",++top,sum-ans/2);
}
return 0;
}