题目链接:哆啦A梦传送门
题意:给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=1n∑j=1mlcm(i,j)。
参考博客链接:https://www.cnblogs.com/cjyyb/p/8253033.html)
设 n<m:
a
n
s
=
∑
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
n
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
d
]
(
i
∗
j
d
)
=
∑
d
=
1
n
d
∑
i
=
1
n
/
d
∑
j
=
1
m
/
d
[
g
c
d
(
i
,
j
)
=
1
]
(
i
∗
j
)
\begin{aligned} ans&=\sum_{i=1}^{n} \sum_{j=1}^{m}lcm(i,j)\\ &=\sum_{i=1}^{n} \sum_{j=1}^{m}(\frac{i*j}{gcd(i,j)})\\ &=\sum_{d=1}^{n}\sum_{i=1}^{n} \sum_{j=1}^{m}[gcd(i,j)=d](\frac{i*j}{d})\\ &=\sum_{d=1}^{n}d\sum_{i=1}^{n/d} \sum_{j=1}^{m/d}[gcd(i,j)=1](i*j)\\ \end{aligned}
ans=i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑m(gcd(i,j)i∗j)=d=1∑ni=1∑nj=1∑m[gcd(i,j)=d](di∗j)=d=1∑ndi=1∑n/dj=1∑m/d[gcd(i,j)=1](i∗j)
我
们
再
设
f
(
d
)
=
∑
i
=
1
x
∑
j
=
1
y
[
g
c
d
(
i
,
j
)
=
d
]
(
i
∗
j
)
我们再设f(d)=\sum_{i=1}^{x} \sum_{j=1}^{y}[gcd(i,j)=d](i*j)
我们再设f(d)=∑i=1x∑j=1y[gcd(i,j)=d](i∗j)
我们根据莫比乌斯第二描述:
F
(
n
)
=
∑
n
∣
d
f
(
d
)
f
(
n
)
=
∑
n
∣
d
u
(
d
n
)
F
(
d
)
F(n)=\sum_{n|d}f(d) \\ f(n)=\sum_{n|d}u(\frac{d}{n})F(d)
F(n)=n∣d∑f(d)f(n)=n∣d∑u(nd)F(d)
可得:
f(d)为满足gcd(i,j)=d的i,j的乘积和。
那F(1) = f(1) + f(2) + f(3) + …
F(2) = f(2) + f(4) + f(6) +…
我们可以看出F(d)就是满足gcd(x,y)为d的倍数的x,y的乘积和
那F(d)的公式就容易求了
因为
F(1) = f(1) + f(2) + f(3) + …
所以
f(1) = μ(1)*F(1) + μ(2)*F(2) + μ(3)*F(3) + …
即:
F
(
n
)
=
∑
n
∣
d
f
(
d
)
=
∑
i
=
1
x
∑
j
=
1
y
[
n
∣
g
c
d
(
i
,
j
)
=
d
]
(
i
∗
j
)
=
n
2
∑
i
=
1
x
/
n
∑
j
=
1
y
/
n
[
1
∣
g
c
d
(
i
,
j
)
=
d
]
(
i
∗
j
)
\begin{aligned}F(n)&=\sum_{n|d}f(d)\\ &=\sum_{i=1}^{x} \sum_{j=1}^{y}[n|gcd(i,j)=d](i*j)\\ &=n^2\sum_{i=1}^{x/n} \sum_{j=1}^{y/n}[1|gcd(i,j)=d](i*j) \end{aligned}
F(n)=n∣d∑f(d)=i=1∑xj=1∑y[n∣gcd(i,j)=d](i∗j)=n2i=1∑x/nj=1∑y/n[1∣gcd(i,j)=d](i∗j)
我们再设:
s
u
m
=
∑
i
=
1
a
∑
j
=
1
b
(
i
∗
j
)
=
a
∗
(
a
+
1
)
2
∗
b
∗
(
b
+
1
)
2
sum=\sum_{i=1}^{a} \sum_{j=1}^{b}(i*j)=\frac{a*(a+1)}{2}*\frac{b*(b+1)}{2}
sum=∑i=1a∑j=1b(i∗j)=2a∗(a+1)∗2b∗(b+1)
显然永远满足
[
1
∣
g
c
d
(
i
,
j
)
=
d
]
。
[1|gcd(i,j)=d]。
[1∣gcd(i,j)=d]。
最后我们反演一下:
f
(
1
)
=
∑
n
∣
d
u
(
d
)
F
(
d
)
=
∑
d
=
1
x
u
(
d
)
F
(
d
)
=
∑
d
=
1
x
u
(
d
)
d
2
∑
i
=
1
x
/
d
∑
j
=
1
y
/
d
(
i
∗
j
)
\begin{aligned} f(1)&=\sum_{n|d}u(d)F(d)\\ &=\sum_{d=1}^{x}u(d)F(d)\\ &=\sum_{d=1}^{x}u(d)d^2\sum_{i=1}^{x/d} \sum_{j=1}^{y/d}(i*j) \end{aligned}
f(1)=n∣d∑u(d)F(d)=d=1∑xu(d)F(d)=d=1∑xu(d)d2i=1∑x/dj=1∑y/d(i∗j)
即:
a
n
s
=
∑
d
=
1
n
d
∑
i
=
1
n
/
d
∑
j
=
1
m
/
d
[
g
c
d
(
i
,
j
)
=
1
]
(
i
∗
j
)
f
(
1
)
=
∑
d
=
1
x
u
(
d
)
d
2
∑
i
=
1
x
/
d
∑
j
=
1
y
/
d
(
i
∗
j
)
ans=\sum_{d=1}^{n}d\sum_{i=1}^{n/d} \sum_{j=1}^{m/d}[gcd(i,j)=1](i*j)\\ f(1)=\sum_{d=1}^{x}u(d)d^2\sum_{i=1}^{x/d} \sum_{j=1}^{y/d}(i*j)
ans=d=1∑ndi=1∑n/dj=1∑m/d[gcd(i,j)=1](i∗j)f(1)=d=1∑xu(d)d2i=1∑x/dj=1∑y/d(i∗j)
最终得:
a
n
s
=
∑
d
=
1
n
d
∑
i
=
1
n
/
d
u
(
i
)
∗
i
2
s
u
m
(
n
d
∗
i
,
m
d
∗
i
)
ans=\sum_{d=1}^{n}d\sum_{i=1}^{n/d}u(i)*i^2sum(\frac{n}{d*i},\frac{m}{d*i})
ans=∑d=1nd∑i=1n/du(i)∗i2sum(d∗in,d∗im)
根据这两个式子,我们先预处理
u
(
i
)
∗
i
2
u(i)*i^2
u(i)∗i2,再分块下就解决了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e7 + 5;
int mu[N], vis[N], prime[N];
int tot;
int n,m;
const LL mod=20101009;
LL sum[N];
void init(){
mu[1] = 1;
for(int i = 2; i<=n; i ++){
if(!vis[i]){
prime[tot ++] = i;
mu[i] = -1;
}
for(int j = 0; j < tot && i * prime[j] <=n; j ++){
vis[i * prime[j]] = 1;
if(i % prime[j]) mu[i * prime[j]] = -mu[i];
else{
mu[i * prime[j]] = 0;
break;
}
}
}
///预处理u(i)*i*i的前缀和
sum[0]=0LL;
for(int i=1;i<=n;i++)
sum[i]=(sum[i-1]+(1LL*mu[i]*i%mod*i%mod))%mod;
}
LL ans(LL x,LL y)
{
x=(x*(x+1)/2)%mod;
y=(y*(y+1)/2)%mod;
return x*y%mod;
}
///整数分块求函数f(1)
LL f(int x,int y)
{
int r;
LL re=0;
for(int l=1;l<=x;l=r+1){
r=min(x/(x/l),y/(y/l));
re=(re+(sum[r]-sum[l-1]+mod)%mod*ans((LL)x/l,(LL)y/l)%mod)%mod;
}
return re;
}
int main(){
scanf("%d%d",&n,&m);
if(n>m) swap(n,m);
init();
LL re=0;
int r;
///整数分块求sum
for(int l=1;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
re=(re+1LL*(l+r)*(r-l+1)/2%mod*f(n/l,m/l)%mod)%mod;
}
printf("%lld\n",re);
return 0;
}
我的标签:做个有情怀的程序员。