Code:
#include<bits/stdc++.h> #define ll long long #define M 10001000 #define maxn 10200100 #define MOD 100000009 using namespace std; int cnt, tot; int vis[maxn],mu[maxn], prime[maxn]; ll h[maxn], sumv[maxn]; void init() { int i,j; h[1]=1; for(i=2;i<M;++i) { if(!vis[i]) prime[++tot]=i, h[i]=(i-(ll)i*i)%MOD; for(j=1;j<=tot&&prime[j]*i<M;++j) { vis[prime[j]*i]=1; if(i%prime[j]==0) { h[prime[j]*i]=(prime[j]*h[i])%MOD; break; } else h[prime[j]*i]=(h[prime[j]]*h[i])%MOD; } } for(i=1;i<M;++i) sumv[i]=(sumv[i-1]+h[i])%MOD; } ll SUM(ll x,ll y) { x%=MOD, y%=MOD; ll r1=(x*(x+1)>>1)%MOD; ll r2=(y*(y+1)>>1)%MOD; return (r1*r2)%MOD; } ll query(ll n,ll m) { int i,last,re=0,j; if(n>m) swap(n,m); for(i=1;i<=n;i=j+1) { j=min(n/(n/i), m/(m/i)); re += SUM(n/i, m/i) * (sumv[j]-sumv[i-1])%MOD; re%=MOD; } return (re+MOD)%MOD; } int main() { init(); int n,m,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); printf("%lld\n",query(n,m)); } return 0; }