假设$n\leq m$,并设$S_2(n)=\dfrac{n(n+1)}2$
$\begin{align*}\sum\limits_{i=1}^n\sum\limits_{j=1}^m[i,j]&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\dfrac{ij}{(i,j)}\\&=\sum\limits_{d=1}^nd\sum\limits_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac md\right\rfloor}ij[(i,j)=1]\\&=\sum\limits_{d=1}^nd\sum\limits_{e=1}^{\left\lfloor\frac nd\right\rfloor}\mu(e)e^2S_2\left(\left\lfloor\dfrac n{de}\right\rfloor\right)S_2\left(\left\lfloor\dfrac m{de}\right\rfloor\right)\end{align*}$
令$T=de$,答案为$\sum\limits_{T=1}^nS_2\left(\left\lfloor\dfrac nT\right\rfloor\right)S_2\left(\left\lfloor\dfrac mT\right\rfloor\right)T\sum\limits_{e|T}e\mu(e)$
$f(n)=n\sum\limits_{e|n}e\mu(e)$是积性函数,线性筛出前缀和即可
#include<stdio.h> typedef long long ll; const int mod=100000009,T=10000000; int mul(int a,int b){return a*(ll)b%mod;} int ad(int a,int b){return(a+b)%mod;} void swap(int&a,int&b){a^=b^=a^=b;} int min(int a,int b){return a<b?a:b;} int pr[T+10],f[T+10]; bool np[T+10]; void sieve(){ int i,j,M; M=0; f[1]=1; for(i=2;i<=T;i++){ if(!np[i]){ M++; pr[M]=i; f[i]=1-i; } for(j=1;j<=M&&pr[j]*(ll)i<=T;j++){ np[i*pr[j]]=1; if(i%pr[j]==0){ f[i*pr[j]]=f[i]; break; } f[i*pr[j]]=mul(f[i],1-pr[j]); } } for(i=1;i<=T;i++)f[i]=mul(f[i],i); for(i=2;i<=T;i++)(f[i]+=f[i-1])%=mod; } int s2(ll n){return(n+1)*n/2%mod;} int solve(int n,int m){ if(n>m)swap(n,m); int i,nex,s; s=0; for(i=1;i<=n;i=nex+1){ nex=min(n/(n/i),m/(m/i)); s=ad(s,mul(f[nex]-f[i-1],mul(s2(n/i),s2(m/i)))); } return ad(s,mod); } int main(){ sieve(); int t,n,m; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); printf("%d\n",solve(n,m)); } }