正题
题目要求这个东西
其实就是求
根据
换出来变成
枚举d变成
设,那么就变成
发现做不了。
看一下后面的东西,我们把它设成
那么
很明显发现
prime函数指的是第i位是否为质数,是则为1,否则为0.
然后整除分块一下,预处理狄利克雷卷积。
然后n才1e7,按定义枚举
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int T;
const int maxn=1e7;
int mu[maxn+10],q[maxn+10],P[maxn+10];
bool vis[maxn+10];
int n,m;
int main(){
scanf("%d",&T);
mu[1]=1;vis[1]=true;
for(int i=2;i<=maxn;i++){
if(!vis[i]) {P[++P[0]]=i;mu[i]=-1;}
for(int j=1;j<=P[0] && (long long) i*P[j]<=maxn;j++){
int temp=i*P[j];
vis[temp]=true;
if(i%P[j]==0) break;
mu[temp]=-mu[i];
}
}
for(int i=1;i<=P[0];i++)
for(int j=1;j<=maxn/P[i];j++) q[P[i]*j]+=mu[j];
for(int i=1;i<=maxn;i++) q[i]+=q[i-1];
while(T--){
scanf("%d %d",&n,&m);
if(m<n) swap(n,m);
int l=1,r,a,b;
long long ans=0;
while(l<=n){
a=n/(n/l);
b=m/(m/l);
r=min(a,b);
ans+=(long long)(n/l)*(m/l)*(q[r]-q[l-1]);
l=r+1;
}
printf("%lld\n",ans);
}
}