似乎和problem b一模一样
水一发
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define N 50005
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(f=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i;
}
int prime[N],a[N],mu[N];
void pre()
{
int top=0; mu[1]=1;
for(int i=2;i<=N;i++)
{
if(!a[i])
{
prime[++top]=i;
mu[i]=-1;
}
for(int j=1;prime[j]*i<N;j++)
{
a[i*prime[j]]=1;
if(i%prime[j]==0)
break;
mu[i*prime[j]]=-mu[i];
}
}
for(int i=2;i<N;i++) mu[i]+=mu[i-1];
}
int main()
{
pre();
int T=sc();
while(T--)
{
int ans=0,n=sc(),m=sc(),z=sc();
n/=z;
m/=z;
if(n>m)swap(n,m);
for(int i=1,last;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=(n/i)*(m/i)*(mu[last]-mu[i-1]);
}
printf("%d\n",ans);
}
return 0;
}