传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2693
题目大意:
求
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)
∑i=1n∑j=1mlcm(i,j)
s
o
l
u
t
i
o
n
solution
solution
这种题无脑推式子就行了
假定
n
≥
m
n\ge m
n≥m
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
m
i
j
g
c
d
(
i
,
j
)
=
∑
d
=
1
m
1
d
∑
d
∣
i
∑
d
∣
j
i
j
∗
[
g
c
d
(
i
,
j
)
=
=
d
]
=
∑
d
=
1
m
d
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
∗
[
g
c
d
(
i
,
j
)
=
=
1
]
=
∑
d
=
1
m
d
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
∑
t
∣
g
c
d
(
i
,
j
)
μ
(
t
)
=
∑
d
=
1
m
d
∑
t
=
1
⌊
m
d
⌋
μ
(
t
)
t
2
∑
i
=
1
⌊
n
t
d
⌋
∑
j
=
1
⌊
m
t
d
⌋
i
j
=
∑
T
=
1
m
∑
i
=
1
⌊
n
T
⌋
i
∑
j
=
1
⌊
m
T
⌋
j
∑
t
∣
T
μ
(
t
)
∗
t
2
∗
T
t
=
∑
T
=
1
m
(
(
1
+
⌊
n
T
⌋
)
⌊
n
T
⌋
2
)
∗
(
(
1
+
⌊
m
T
⌋
)
⌊
m
T
⌋
2
)
∑
t
∣
T
T
μ
(
t
)
t
=
∑
T
=
1
m
f
(
⌊
n
T
⌋
,
⌊
m
T
⌋
)
∗
g
(
T
)
\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\\ =\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\\ =\sum_{d=1}^m\frac{1}{d}\sum_{d|i}\sum_{d|j}ij*[gcd(i,j)==d]\\ =\sum_{d=1}^md\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{m}{d}\rfloor}ij*[gcd(i,j)==1]\\ =\sum_{d=1}^md\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{m}{d}\rfloor}ij\sum_{t|gcd(i,j)}\mu(t)\\ =\sum_{d=1}^md\sum_{t=1}^{\lfloor \frac{m}{d} \rfloor} \mu (t)t^2\sum_{i=1}^{\lfloor \frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor \frac{m}{td}\rfloor} ij\\ =\sum_{T=1}^{m}\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}j\sum_{t|T}\mu(t)*t^2*\frac{T}{t}\\ =\sum_{T=1}^m\left(\frac{(1+\lfloor\frac{n}{T}\rfloor)\lfloor\frac{n}{T}\rfloor}{2}\right)* \left(\frac{(1+\lfloor\frac{m}{T}\rfloor)\lfloor\frac{m}{T}\rfloor}{2}\right)\sum_{t|T}T\mu(t)t\\ =\sum_{T=1}^mf(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)*g(T)
i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)ij=d=1∑md1d∣i∑d∣j∑ij∗[gcd(i,j)==d]=d=1∑mdi=1∑⌊dn⌋j=1∑⌊dm⌋ij∗[gcd(i,j)==1]=d=1∑mdi=1∑⌊dn⌋j=1∑⌊dm⌋ijt∣gcd(i,j)∑μ(t)=d=1∑mdt=1∑⌊dm⌋μ(t)t2i=1∑⌊tdn⌋j=1∑⌊tdm⌋ij=T=1∑mi=1∑⌊Tn⌋ij=1∑⌊Tm⌋jt∣T∑μ(t)∗t2∗tT=T=1∑m(2(1+⌊Tn⌋)⌊Tn⌋)∗(2(1+⌊Tm⌋)⌊Tm⌋)t∣T∑Tμ(t)t=T=1∑mf(⌊Tn⌋,⌊Tm⌋)∗g(T)
g
(
x
)
g(x)
g(x)显然是个积性函数,直接线性筛
其他就是莫比乌斯反演的套路了
O
(
T
n
+
n
)
O(T\sqrt{n}+n)
O(Tn+n)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
#define N 10000000
int rd()
{
int num = 0;char c = getchar();bool flag = true;
while(c < '0'||c > '9') {if(c == '-') flag = false;c = getchar();}
while(c >= '0' && c <= '9') num = num*10+c-48,c = getchar();
if(flag) return num;else return -num;
}
const int p = 1e8+9;
int n,m,inv;
int f[N+10000],prime[N+10000],miu[N+10000];
inline int mo(int a){return a>=p?a-p:a;}
inline int calc(int a,int b){return (a+=b)>=p?a-=p:a;}
inline int mul(int a,int b){return 1ll*a*b%p;}
inline int del(int a,int b){return (a-=b)<0?a+=p:a;}
void pre()
{
miu[1] = 1;f[1] = miu[1]*1;
rep(i,2,N)
{
if(!f[i]) miu[i] = p-1,f[i] = calc(f[1],mul(miu[i],i)),prime[++prime[0]] = i;
rep(j,1,prime[0])
{
if(i*prime[j]>N) break;
miu[i*prime[j]] = i%prime[j]?mo(p-miu[i]):0;
f[i*prime[j]] = i%prime[j]?mul(f[i],f[prime[j]]):f[i];
if(i%prime[j] == 0) break;
}
}
rep(i,1,N) f[i] = mul(f[i],i);
rep(i,1,N) f[i] = calc(f[i],f[i-1]);
}
void work()
{
n = rd();m = rd();
if(n < m) swap(n,m);
int i = 1;
int ans = 0;
while(i<=m)
{
int j = min(n/(n/i),m/(m/i)),tmpn = n/i,tmpm = m/i;
int v = mul(inv,mul(1+tmpn,tmpn));v = mul(v,mul(inv,mul(1+tmpm,tmpm)));
ans = calc(ans,mul(v,del(f[j],f[i-1])));
i = j+1;
}
printf("%d\n",ans);
}
int main()
{
inv = (p+1)/2;
pre();
int T = rd();
while(T--) work();
return 0;
}