题目描述:
∑ni=1∑mj=1(gcd(i,j)==d) ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) == d )
题目分析:
题目链接:
Ac 代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#define sqr(x) x*x
#define ll long long
const int maxm=51000;
int mu[maxm],prime[maxm],sum[maxm],cnt,n;
bool vis[maxm];
void getmu()
{
mu[1]=1,vis[1]=1;
for(int i=2;i<=maxm;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
//printf("%d\n",i);
mu[i]=-1;
}
for(int j=1;j<=cnt&&prime[j]*i<=maxm;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;
break;
}
mu[prime[j]*i]=-mu[i];
}
}
for(int i=1;i<=maxm;i++) sum[i]=mu[i]+sum[i-1];
}
int cal(int x,int y)
{
int ans=0,last;
for(int i=1;i<=std::min(x,y);i=last+1)
{
last=std::min(x/(x/i),y/(y/i));
ans+=(sum[last]-sum[i-1])*(x/i)*(y/i);
}
return ans;
}
void work()
{
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
a/=k,b/=k;
printf("%d\n",cal(a,b));
}
int main()
{
getmu();
int q;
scanf("%d",&q);
while(q--)
work();
return 0;
}