对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a
,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助(1<=d<=a,b<=50000)(1<=n<= 50000)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50000+10;
int mu[maxn],vis[maxn],primes[maxn],sum[maxn];
void getmobius() {
memset(vis,0,sizeof(vis));
mu[1] = 1;
int cnt = 0;
for (int i = 2; i < maxn; i++) {
if (!vis[i]) {
primes[cnt++] = i;
mu[i] = -1;
}
for (int j = 0; j < cnt && i*primes[j] < maxn; j++) {
vis[i*primes[j]] = 1;
if (i%primes[j] == 0) {
mu[i*primes[j]] = 0;
break;
}
else mu[i*primes[j]] = -mu[i];
}
}
sum[0] = 0;
for (int i = 1; i < maxn; i++) sum[i] = sum[i-1]+mu[i];
}
int main()
{
getmobius();
int t;
scanf ("%d",&t);
while(t--) {
int a,b,D;
scanf ("%d%d%d",&a,&b,&D);
a /= D, b /= D;
int x = min(a,b);
ll ans = 0;
for (int i = 1; i <= x; ) {
int pos = min(a/(a/i),b/(b/i));
ans += (ll)(sum[pos]-sum[i-1])*(a/i)*(b/i);
i = pos+1;
}
printf ("%lld\n",ans);
}
return 0;
}