题目链接
题解:
这道题的关键就是
这个式子带进去化简完了后的答案如上图所示。
#include <bits/stdc++.h>
#define int long long
#define mod 20101009
using namespace std;
typedef long long ll;
const int N=50010;
int n,m,mob[N],f[N],cnt,prime[N];
bool vis[N];
void init()
{
mob[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]) prime[cnt++]=i,mob[i]=-1;
for(int j=0;j<cnt&&prime[j]*i<N;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0){
mob[prime[j]*i]=0;
break;
}mob[prime[j]*i]=-mob[i];
}
}
for(int i=1;i<N;i++) mob[i]+=mob[i-1];
for(int i=1;i<N;i++){
for(int l=1,r;l<=i;l=r+1){
r=i/(i/l);
f[i]+=(r-l+1)*(i/l);
}
}
}
signed main()
{
init();
int T; scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int res=0;
for(int l=1,r;l<=min(n,m);l=r+1){
r=min(n/(n/l),m/(m/l));
res+=((mob[r]-mob[l-1])*f[n/l]*f[m/l]);
}
printf("%lld\n",res);
}
}