题目:
题目链接:
题解:
莫比乌斯反演
#include <bits/stdc++.h>
#define N 10000010
using namespace std;
long long pri[N],cnt,g[N];
bool st[N];
long long mu[N],sum[N];
void get_mu()
{
mu[1]=1;
for(long long i=2;i<N;i++)
{
if(!st[i]){mu[i]=-1;pri[++cnt]=i;}
for(long long j=1;j<=cnt&&pri[j]*i<N;j++)
{
st[i*pri[j]]=true;
if(i%pri[j]==0)break;
else mu[pri[j]*i]=-mu[i];
}
}
for(int j=1;j<=cnt;j++)
for(long long i=1;i*pri[j]<N;i++)g[i*pri[j]]+=mu[i];
for(long long i=1;i<N;i++)sum[i]=sum[i-1]+g[i];
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
get_mu();
int t;
cin>>t;
while(t--)
{
long long n,m;
cin>>n>>m;
long long x=min(n,m);
long long ans=0;
for(long long i=1,r=1;i<=x;i=r+1)
{
r=min(x,min(n/(n/i),m/(m/i)));
ans+=(sum[r]-sum[i-1])*(n/i)*(m/i);
}
cout<<ans<<endl;
}
return 0;
}