题意
∑ni=1∑mj=1(gcd(i,j)==pi) ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) == p i ) pi为质数 p i 为 质 数
题目分析:
题目链接:
Ac 代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#define sqr(x) x*x
#define ll long long
const int maxm=10000010;
ll mu[maxm],sum[maxm],f[maxm];
int cnt,prime[maxm];
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<=cnt;i++)
for(int j=1;j*prime[i]<=maxm;j++)
f[j*prime[i]]+=mu[j];
for(int i=2;i<=maxm;i++) sum[i]=sum[i-1]+f[i];
}
int main()
{
int q;
scanf("%d",&q);
getmu();
while(q--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll ans=0;
int last=0;
for(int i=1;i<=std::min(n,m);i=last+1)
{
last=std::min(n/(n/i),m/(m/i));
ans+=(1ll*(n/i)*1ll*(m/i)*1ll*(sum[last]-sum[i-1]));
}
printf("%lld\n",ans);
}
return 0;
}