莫比乌斯反演
不难推出关于每一个质数的一个式子,然而显然会T,需要继续推下去。
详见:http://blog.csdn.net/wzq_QwQ/article/details/46952469
#include<cstdio>
#include<algorithm>
#define N 10000005
#define ll long long
using namespace std;
bool notprime[N];
int prime[N], pcnt, mu[N];
ll f[N];
int main()
{
mu[1]=1;
for(int i = 2; i < N; i++)
{
if(!notprime[i])
{
prime[++pcnt]=i;
mu[i]=-1;
}
for(int j = 1; 1ll*prime[j]*i<N && j <= pcnt; j++)
{
notprime[prime[j]*i]=1;
if(i%prime[j])
{
mu[prime[j]*i]=-mu[i];
}
else
{
mu[prime[j]*i]=0;
break;
}
}
}
for(int i = 1; i <= pcnt; i++)
for(int j = 1; j * prime[i] < N; j++)
f[prime[i]*j] += mu[j];
for(int i = 1; i < N; i++)
f[i]+=f[i-1];
int T, n, m;
ll ans;
scanf("%d",&T);
for(;T--;)
{
scanf("%d%d",&n,&m);
ans = 0;
if(n>m)swap(n,m);
for(int i = 1, j; i <= n; i=j+1)
{
j = min(n/(n/i), m/(m/i));
ans += 1ll * (n/i) * (m/i) *(f[j]-f[i-1]);
}
printf("%lld\n",ans);
}
}