description
solution
我们可以发现一个性质
ans=n+m+∑n−1i=1∑j=1m−1([(i,j)==1](n−i)(m−j)−[(i,j)==2](n−i)(m−j))
考虑两条重合的直线(以两个端点确定一条直线的线段)会被这两条直线(以两个端点确定一条直线的线段的并)所减去,知道这个性质之后直接莫比乌斯反演就可以了。
code
using namespace std;
int const mn=4000+9,mo=1<<30;
int t,n,m,ss[mn],tag[mn],mu[mn];
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d",&t);
int lim=4000;
mu[1]=1;
fo(i,2,lim){
if(!tag[i])ss[++ss[0]]=i,mu[i]=-1;
fo(j,1,ss[0]){
if(i*ss[j]>lim)break;
tag[i*ss[j]]=1;
mu[i*ss[j]]=-mu[i];
if(i%ss[j]==0){
mu[i*ss[j]]=0;
break;
}
}
}
fo(cas,1,t){
scanf("%d%d",&n,&m);
if(n<m)swap(n,m);
LL ans=0;
fo(i,1,n-1){
LL nn=(n-1)/i,mm=(m-1)/i;
ans=(ans+mu[i]*(nn*mm*n*m-m*i*mm*(1+nn)*nn/2
-n*i*nn*(1+mm)*mm/2+i*i*(1+nn)*nn/2*(1+mm)*mm/2)
-mu[i]*((nn/2)*(mm/2)*n*m-m*i*2*(mm/2)*(1+(nn/2))*(nn/2)/2
-n*i*2*(nn/2)*(1+(mm/2))*(mm/2)/2
+i*i*4*(1+(nn/2))*(nn/2)/2*(1+(mm/2))*(mm/2)/2))%mo;
}
printf("%lld\n",((ans*2+n+m)%mo+mo)%mo);
}
return 0;
}