题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695
题意:从[1,b]和[1,d]中各取一个数n,m,求gcd(n,m)=k(即gcd(n/k,m/k)=1)的这样的n,m的对数。
AC代码:
#include <stdio.h>
#include <string.h>
#define ll __int64
#define MAXN 1000000
bool check[MAXN+2];
int prime[MAXN+2];
int mu[MAXN+2];
void Moblus(){
memset(check,false,sizeof(check));
mu[1] = 1;
int tot=0,i,j;
for(i=2;i<=MAXN;i++){
if(!check[i]){
prime[tot++] = i;
mu[i] = -1;
}
for(j=0;j<tot;j++){
if(i*prime[j]>MAXN)
break;
check[i*prime[j]]=true;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main(){
int a,b,c,d,k,n,t=1;
Moblus();
scanf("%d",&n);
while(n--){
int i,x;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0){
printf("Case %d: 0\n",t++);
continue;
}
b/=k;
d/=k;
if(b>d){
x=b;
b=d;
d=x;
}
ll ans=0,sum=0;
for(i=1;i<=b;i++){
ans+=(ll)mu[i]*(b/i)*(d/i);
sum+=(ll)mu[i]*(b/i)*(b/i);
}
ans-=sum/2;
printf("Case %d: %I64d\n",t++,ans);
}
return 0;
}