题解:
莫比乌斯反演经典题目
直接套公式好了
代码:
#include<bits/stdc++.h> using namespace std; const int N=1000005; typedef long long ll; int n,m,k,p[N],tot,flag[N],miu[N]; ll ans,ans2; void init() { miu[1]=1; for (int i=2;i<N;i++) { if (!flag[i]) { miu[i]=-1; p[++tot]=i; } for (int j=1;j<=tot;j++) { int k=p[j]*i; if (k>=N)break; flag[k]=1; if (i%p[j]==0) { miu[k]=0; break; } miu[k]-=miu[i]; } } } int main() { scanf("%d%d%d",&n,&m,&k); n/=k;m/=k; init(); for (int i=1;i<=m;i++)ans+=(ll)miu[i]*(n/i)*(m/i); printf("%lld",ans); }