分析:感觉不会英语都看得懂= =。
洛谷 P2522 [HAOI2011]Problem b
和上面这题是一样的啦
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
const int maxn=50007;
using namespace std;
int mu[maxn],prime[maxn],not_prime[maxn],sum[maxn];
int n,i,A,B,C,D,k,cnt;
void get_mu(int n)
{
int i,j;
mu[1]=1;
for (i=2;i<=n;i++)
{
if (!not_prime[i])
{
prime[++cnt]=i;
mu[i]=-1;
}
for (j=1;j<=cnt;j++)
{
if (prime[j]*i>n) break;
not_prime[i*prime[j]]=1;
if (i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
sum[1]=mu[1];
for (i=2;i<=n;i++) sum[i]=sum[i-1]+mu[i];
}
int get(int n,int m,int k)
{
if (n>m) swap(n,m);
int i=1,j=0,ans=0;
for (i=1;i<=n/k;i=j+1)
{
j=min(n/k/(n/k/i),m/k/(m/k/i));
ans+=(n/i/k)*(m/i/k)*(sum[j]-sum[i-1]);
}
return ans;
}
int main()
{
scanf("%d",&n);
get_mu(50000);
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&A,&B,&k);
int ans=get(A,B,k);
printf("%d\n",ans);
}
}