不妨先设 n < = m n<=m n<=m。
把题目的柿子推一下:
∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j) i=1∑nj=1∑mlcm(i,j)
由于 l c m ( i , j ) ∗ g c d ( i , j ) = i j lcm(i,j)*gcd(i,j)=ij lcm(i,j)∗gcd(i,j)=ij
= ∑ i = 1 n ∑ j = 1 m i j g c d ( i , j ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{gcd(i,j)} =i=1∑nj=1∑mgcd(i,j)ij
设 d = g c d ( i , j ) d=gcd(i,j) d=gcd(i,j),我们枚举 d d d,提到最前面,再枚举 i i i是 d d d的几倍、 j j j是 d d d的几倍。
= ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ ( d × i ) × ( d × j ) d [ g c d ( ( d × i ) , ( d × j ) ) = d ] =\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}\frac{(d\times i)\times (d\times j)}{d}[gcd((d\times i),(d\times j))=d] =d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋d(d×i)×(d×j)[gcd((d×i),(d×j))=d]
则在上面这个柿子中, ( d × i ) (d\times i) (d×i)为原来的 i i i, ( d × j ) (d\times j) (d×j)为原来的 j j j。将分式化简, g c d ( d × i , d × j ) = d gcd(d\times i,d\times j)=d gcd(d×i,d×j)=d里同时约掉一个 d d d得:
= ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ d × i × j [ g c d ( i , j ) = 1 ] =\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}d\times i\times j[gcd(i,j)=1] =d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋d×i×j[gcd(i,j)=1]
考虑到 ∑ i ∣ n μ ( i ) = [ n = 1 ] \sum_{i|n}\mu(i)=[n=1] ∑i∣nμ(i)=[n=1],代入 [ g c d ( i , j ) = 1 ] [gcd(i,j)=1] [gcd(i,j)=1]得:
= ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i × j ∑ k ∣ g c d ( i , j ) μ ( k ) =\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} i\times j\sum_{k|gcd(i,j)}\mu(k) =d=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋i×jk∣gcd(i,j)∑μ(k)
我们再次枚举 k k k,提到 ∑ d = 1 n \sum_{d=1}^n ∑d=1n后:
= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i × j [ k ∣ g c d ( i , j ) ] =\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}i\times j[k|gcd(i,j)] =d=1∑ndk=1∑⌊dn⌋μ(k)i=1∑⌊dn⌋j=1∑⌊dm⌋i×j[k∣gcd(i,j)]
考虑到 [ k ∣ g c d ( i , j ) ] [k|gcd(i,j)] [k∣gcd(i,j)]即为 [ k ∣ i , k ∣ j ] [k|i,k|j] [k∣i,k∣j]:
(1) = ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n d ⌋ i [ k ∣ i ] ∑ j = 1 ⌊ m d ⌋ j [ k ∣ j ] =\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}i[k|i]\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}j[k|j] \tag{1} =d=1∑ndk=1∑⌊dn⌋μ(k)i=1∑⌊dn⌋i[k∣i]j=1∑⌊dm⌋j[k∣j](1)
这时我们先推另一个柿子: ∑ i = 1 n [ k ∣ i ] \sum_{i=1}^n[k|i] ∑i=1n[k∣i],也就是询问 1 1 1~ n n n这些数中有多少个数是 k k k的倍数,答案显然是 ⌊ n k ⌋ \lfloor \frac{n}{k} \rfloor ⌊kn⌋。
但如果是求 ∑ i = 1 n i [ k ∣ i ] \sum_{i=1}^ni[k|i] ∑i=1ni[k∣i]呢?
也就是吧所有 1 1 1~ n n n中所有是 k k k的倍数的数加起来,答案显然就是 1 × k + 2 × k + . . . + ⌊ n k ⌋ × k = ( 1 + 2 + . . . + ⌊ n k ⌋ ) × k = ( 1 + ⌊ n k ⌋ ) × ⌊ n k ⌋ × k 2 1\times k+2\times k+...+\lfloor \frac{n}{k} \rfloor \times k=(1+2+...+\lfloor \frac{n}{k} \rfloor)\times k=\frac{(1+\lfloor \frac{n}{k} \rfloor)\times \lfloor \frac{n}{k} \rfloor \times k}{2} 1×k+2×k+...+⌊kn⌋×k=(1+2+...+⌊kn⌋)×k=2(1+⌊kn⌋)×⌊kn⌋×k
把这个代入 ( 1 ) (1) (1)得
= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) × ( 1 + ⌊ ⌊ n d ⌋ k ⌋ ) × ⌊ ⌊ n d ⌋ k ⌋ × k 2 × ( 1 + ⌊ ⌊ m d ⌋ k ⌋ ) × ⌊ ⌊ m d ⌋ k ⌋ × k 2 =\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\times\frac{(1+\lfloor \frac{\lfloor \frac{n}{d} \rfloor}{k} \rfloor)\times \lfloor \frac{\lfloor \frac{n}{d} \rfloor}{k} \rfloor \times k}{2}\times\frac{(1+\lfloor \frac{\lfloor \frac{m}{d} \rfloor}{k} \rfloor)\times \lfloor \frac{\lfloor \frac{m}{d} \rfloor}{k} \rfloor \times k}{2} =d=1∑ndk=1∑⌊dn⌋μ(k)×2(1+⌊k⌊dn⌋⌋)×⌊k⌊dn⌋⌋×k×2(1+⌊k⌊dm⌋⌋)×⌊k⌊dm⌋⌋×k
化简一下这个难看的柿子:
= 1 4 ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) × k 2 × ( 1 + ⌊ n d k ⌋ ) × ⌊ n d k ⌋ × ( 1 + ⌊ m d k ⌋ ) × ⌊ m d k ⌋ =\frac{1}{4}\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\times k^2\times(1+ \lfloor \frac{n}{dk} \rfloor)\times \lfloor \frac{n}{dk} \rfloor \times(1+ \lfloor \frac{m}{dk} \rfloor)\times \lfloor \frac{m}{dk} \rfloor =41d=1∑ndk=1∑⌊dn⌋μ(k)×k2×(1+⌊dkn⌋)×⌊dkn⌋×(1+⌊dkm⌋)×⌊dkm⌋
然后令 T = d k T=dk T=dk,我们枚举 T T T,并提到前面来。
= 1 4 ∑ T = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ ∑ d ∣ T d × μ ( T d ) × T 2 d 2 = 1 4 ∑ T = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ ∑ d ∣ T μ ( T d ) × T 2 d \begin{aligned} & =\frac{1}{4}\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloor\sum_{d|T}d\times\mu(\frac{T}{d})\times\frac{T^2}{d^2}\\ & =\frac{1}{4}\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloor\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}\end{aligned} =41T=1∑n(1+⌊Tn⌋)×⌊Tn⌋×(1+⌊Tm⌋)×⌊Tm⌋d∣T∑d×μ(dT)×d2T2=41T=1∑n(1+⌊Tn⌋)×⌊Tn⌋×(1+⌊Tm⌋)×⌊Tm⌋d∣T∑μ(dT)×dT2
令
f ( T ) = ∑ T = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ f(T)=\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloor f(T)=T=1∑n(1+⌊Tn⌋)×⌊Tn⌋×(1+⌊Tm⌋)×⌊Tm⌋
g ( T ) = ∑ d ∣ T μ ( T d ) × T 2 d g(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d} g(T)=d∣T∑μ(dT)×dT2
那么显然,对于 f ( T ) f(T) f(T),我们可以用数论分块做出来。
而对于 g ( T ) g(T) g(T),由于 μ ( T d ) \mu(\frac{T}{d}) μ(dT)是积性函数, T 2 d \frac{T^2}{d} dT2是完全积性函数,所以 g ( T ) g(T) g(T)也是积性函数。
那么对于 g ( T ) g(T) g(T),我们在线性筛时分三种情况讨论:
-
T = p T=p T=p,其中 p p p为质数,那么我们再看回这个柿子:
g ( T ) = ∑ d ∣ T μ ( T d ) × T 2 d g(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d} g(T)=d∣T∑μ(dT)×dT2
明显,由于 μ \mu μ的定义,所以当且仅当 T d = 1 \frac{T}{d}=1 dT=1或 T d = p \frac{T}{d}=p dT=p时才能产生贡献,使 μ ( T d ) ≠ 0 \mu(\frac{T}{d})\ne0 μ(dT)̸=0。
若 T d = 1 \frac{T}{d}=1 dT=1,则 T = d = p T=d=p T=d=p,
μ ( T d ) × T 2 d = μ ( 1 ) × p 2 p = p \mu(\frac{T}{d})\times\frac{T^2}{d}=\mu(1)\times\frac{p^2}{p}=p μ(dT)×dT2=μ(1)×pp2=p
若 T d = p \frac{T}{d}=p dT=p,又 T = p T=p T=p,则 d = 1 d=1 d=1,
μ ( T d ) × T 2 d = μ ( p ) × p 2 1 = − p 2 \mu(\frac{T}{d})\times\frac{T^2}{d}=\mu(p)\times\frac{p^2}{1}=-p^2 μ(dT)×dT2=μ(p)×1p2=−p2
合并起来,即为
g ( T ) = ∑ d ∣ T μ ( T d ) × T 2 d = p − p 2 g(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}=p-p^2 g(T)=d∣T∑μ(dT)×dT2=p−p2
-
T = i ∗ p T=i*p T=i∗p,其中 p p p为质数, i ≠ 1 i\ne1 i̸=1且 i % p ≠ 0 i\%p \ne 0 i%p̸=0,即 g c d ( i , p ) = 1 gcd(i,p)=1 gcd(i,p)=1。那么 g ( T ) = g ( i ) × g ( p ) g(T)=g(i)\times g(p) g(T)=g(i)×g(p)
-
T = i ∗ p T=i*p T=i∗p,其中 p p p为质数, i ≠ 1 i\ne1 i̸=1且 i % p = 0 i\%p = 0 i%p=0,即 g c d ( i , p ) = p gcd(i,p)=p gcd(i,p)=p,不妨设 i = t × p k i=t\times p^k i=t×pk。
考虑推出:
g ( p k ) = ∑ d ∣ p k μ ( p k d ) × p 2 k d g(p^k)=\sum_{d|{p^k}}\mu(\frac{p^k}{d})\times\frac{p^{2k}}{d} g(pk)=d∣pk∑μ(dpk)×dp2k
根据 μ \mu μ的定义,当且仅当 p k d = 1 \frac{p^k}{d}=1 dpk=1或 p k d = p \frac{p^k}{d}=p dpk=p时才能产生贡献,使 μ ( p k d ) ≠ 0 \mu(\frac{p^k}{d})\ne0 μ(dpk)̸=0。
分情况讨论解得:
g ( p k ) = ∑ d ∣ p k μ ( p k d ) × p 2 k d = μ ( p k p k ) × p 2 k p k + μ ( p k p k − 1 ) × p 2 k p k − 1 = p k − p k + 1 \begin{aligned} g(p^k) & =\sum_{d|{p^k}}\mu(\frac{p^k}{d})\times\frac{p^{2k}}{d}\\ & =\mu(\frac{p^k}{p^k})\times \frac{p^{2k}}{p^k}+\mu(\frac{p^k}{p^{k-1}})\times\frac{p^{2k}}{p^{k-1}}\\ & =p^k-p^{k+1} \end{aligned} g(pk)=d∣pk∑μ(dpk)×dp2k=μ(pkpk)×pkp2k+μ(pk−1pk)×pk−1p2k=pk−pk+1
同理,我们可以推得:
g ( p k + 1 ) = p k + 1 − p k + 2 g(p^{k+1})=p^{k+1}-p^{k+2} g(pk+1)=pk+1−pk+2
由上述2式可得:
(2) g ( p k + 1 ) = g ( p k ) × p g(p^{k+1})=g(p^k)\times p \tag{2} g(pk+1)=g(pk)×p(2)
则
g ( T ) = g ( i × p ) = g ( t × p k × p ) = g ( t ) × g ( p k + 1 ) ( t 、 p 互质) = g ( t ) × g ( p k ) × p (结论(2)) = g ( t × p k ) × p ( t 、 p 互质) = g ( i ) × p \begin{aligned} g(T) & =g(i\times p)\\ & =g(t\times p^k \times p)\\ & =g(t)\times g(p^{k+1})\text{($t$、$p$互质)}\\ & =g(t)\times g(p^k)\times p\text{(结论(2))}\\ & =g(t\times p^k)\times p\text{($t$、$p$互质)}\\ & =g(i)\times p \end{aligned} g(T)=g(i×p)=g(t×pk×p)=g(t)×g(pk+1)(t、p互质)=g(t)×g(pk)×p(结论(2))=g(t×pk)×p(t、p互质)=g(i)×p
那么我们可以分3种情况讨论,线性求出每一个 g ( T ) g(T) g(T),再维护一下 g ( T ) g(T) g(T)的前缀和就好了。
最后的代码如下:
#include<bits/stdc++.h>
#define N 10000010
#define ll long long
#define mod 100000009
using namespace std;
int t,n,m,cnt;
ll prime[N],g[N],sum[N];
bool notprime[N];
void work()
{
int maxn=N-10;
g[1]=1;//记得初始化
for(int i=2;i<=maxn;i++)
{
if(!notprime[i])
{
prime[++cnt]=i;
g[i]=((i-1ll*i*i)%mod+mod)%mod;//第一种情况:T=p
}
for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
{
notprime[i*prime[j]]=true;
if(!(i%prime[j]))
{
g[i*prime[j]]=g[i]*prime[j]%mod;//第二种情况:T=i%p且i%p=0
break;
}
g[i*prime[j]]=g[i]*g[prime[j]]%mod;//第三种情况:T=i%p且i%p!=0
}
}
for(int i=1;i<=maxn;i++)
sum[i]=(sum[i-1]+g[i])%mod;//维护前缀和
}
ll query(int n,int m)
{
ll ans=0;
for(int l=1,r=0;l<=n;l=r+1)//数论分块
{
r=min(n/(n/l),m/(m/l));
ll x=n/l,y=m/l;
ans=(ans+(((1ll+x)*x/2ll%mod)*((1ll+y)*y/2%mod)%mod)*(sum[r]-sum[l-1])%mod)%mod;
}
return ans;
}
int main()
{
work();//线性筛
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
printf("%lld\n",(query(n,m)%mod+mod)%mod);
}
return 0;
}