传送门
傻逼莫比乌斯反演练手题。
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 50005
using namespace std;
int tot,T,x,y,z,ans,mo[N],fl[N],pri[N];
int main(){
mo[1]=1;
for (int i=2;i<N;i++){
if (!fl[i]){
pri[++tot]=i;
mo[i]=-1;
}
for (int j=1;j<=tot&&i*pri[j]<N;j++){
fl[i*pri[j]]=1;
if (i%pri[j]==0){
mo[i*pri[j]]=0;
break;
}
mo[i*pri[j]]=-mo[i];
}
}
for (int i=2;i<N;i++)
mo[i]+=mo[i-1];
scanf("%d",&T);
while (T--){
scanf("%d%d%d",&x,&y,&z);
x/=z; y/=z;
if (x>y) swap(x,y);
ans=0;
for (int i=1,j;i<=x;i=j+1){
j=min(x/(x/i),y/(y/i));
ans+=(x/i)*(y/j)*(mo[j]-mo[i-1]);
}
printf("%d\n",ans);
}
}