莫比乌斯反演裸题
#include <bits/stdc++.h>
using namespace std;
#define N 51000
#define ll long long
int prime[N],ip[N],mu[N];
int T,n,m,d,cnt;
ll ans;
void init()
{
mu[1]=1;
for(int i=2;i<=50000;i++)
{
if(!ip[i])prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=50000;j++)
{
ip[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
//freopen("tt.in","r",stdin);
init();
for(int i=1;i<=50000;i++)
mu[i]+=mu[i-1];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&d);
ans=0;
for(int i=1,last;i<=n/d&&i<=m/d;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=(ll)(n/i/d)*(m/i/d)*(mu[last]-mu[i-1]);
}
printf("%lld\n",ans);
}
return 0;
}