求解:
因子和函数的一个特殊的性质,
带回原式,有:
预处理筛出函数,然后分块处理询问。
code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5e4+7; int mu[maxn]; ll d[maxn],t[maxn]; bool vis[maxn]; vector<int>prime; inline void init() { d[1]=mu[1]=1; for(int i=2,x,y;i<maxn;++i) { if(!vis[i]) { prime.emplace_back(i); mu[i]=-1; d[i]=2; t[i]=1; } for(auto &j:prime) { if(i*j>=maxn) break; vis[i*j]=1; if(i%j==0) { d[i*j]=d[i]/(t[i]+1)*(t[i]+2); t[i*j]=t[i]+1; break; } d[i*j]=d[i]<<1; t[i*j]=1; mu[i*j]=-mu[i]; } d[i]+=d[i-1]; mu[i]+=mu[i-1]; } } signed main() { cin.sync_with_stdio(false), cin.tie(nullptr),cout.tie(nullptr); int T,n,m; init(); cin>>T; while(T--) { cin>>n>>m; if(n>m) swap(n,m); ll ans(0); for(int i=1,x,y,r;i<=n;i=r+1) { x=n/i,y=m/i; r=min(n/x,m/y); ans+=d[x]*d[y]*(mu[r]-mu[i-1]); } cout<<ans<<'\n'; } return 0; }