背景:
luogu P1829
\text{luogu P1829 }
luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB的加强版。
题目传送门:
http://www.51nod.com/Challenge/Problem.html#!#problemId=1238
题意:
你可以认为以下的
n
=
m
n=m
n=m。
求
∑
i
=
1
n
∑
j
=
1
m
lcm
(
i
,
j
)
\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)
∑i=1n∑j=1mlcm(i,j)。
思路:
∑ i = 1 n ∑ j = 1 m lcm ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j) i=1∑nj=1∑mlcm(i,j)
= ∑ i = 1 n ∑ j = 1 m i j gcd ( i , j ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)} =i=1∑nj=1∑mgcd(i,j)ij
你设一个
k
k
k枚举
g
c
d
(
i
,
j
)
gcd(i,j)
gcd(i,j)。
=
∑
k
=
1
min
(
n
,
m
)
∑
i
=
1
n
∑
j
=
1
m
i
j
gcd
(
i
,
j
)
[
gcd
(
i
,
j
)
=
k
]
=\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)}[\gcd(i,j)=k]
=k=1∑min(n,m)i=1∑nj=1∑mgcd(i,j)ij[gcd(i,j)=k]
搞掉那一个
k
k
k,得:
=
∑
k
=
1
min
(
n
,
m
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
k
2
i
j
k
[
gcd
(
i
,
j
)
=
1
]
=\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}k^2\frac{ij}{k}[\gcd(i,j)=1]
=k=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋k2kij[gcd(i,j)=1]
化简一下,得:
=
∑
k
=
1
min
(
n
,
m
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
k
[
gcd
(
i
,
j
)
=
1
]
=\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk[\gcd(i,j)=1]
=k=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋ijk[gcd(i,j)=1]
再套一个
∑
d
∣
n
μ
d
=
[
n
=
1
]
\sum_{d|n}\mu_d=[n=1]
∑d∣nμd=[n=1],得:
=
∑
k
=
1
min
(
n
,
m
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
k
∑
d
∣
gcd
(
i
,
j
)
μ
d
=\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk\sum_{d|\gcd(i,j)}\mu_d
=k=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋ijkd∣gcd(i,j)∑μd
搞一下
d
d
d的枚举方式,得:
=
∑
k
=
1
min
(
n
,
m
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
k
∑
d
=
1
min
(
⌊
n
d
⌋
,
⌊
m
d
⌋
)
μ
d
[
d
∣
gcd
(
i
,
j
)
]
=\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d[d|\gcd(i,j)]
=k=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋ijkd=1∑min(⌊dn⌋,⌊dm⌋)μd[d∣gcd(i,j)]
前置一下
d
d
d,得:
=
∑
k
=
1
min
(
n
,
m
)
∑
d
=
1
min
(
⌊
n
d
⌋
,
⌊
m
d
⌋
)
μ
d
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
j
k
[
d
∣
gcd
(
i
,
j
)
]
=\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk[d|\gcd(i,j)]
=k=1∑min(n,m)d=1∑min(⌊dn⌋,⌊dm⌋)μdi=1∑⌊dn⌋j=1∑⌊dm⌋ijk[d∣gcd(i,j)]
更换一下枚举项,从而消除判断条件,得:
=
∑
k
=
1
min
(
n
,
m
)
∑
d
=
1
min
(
⌊
n
d
⌋
,
⌊
m
d
⌋
)
μ
d
∑
i
=
1
⌊
n
k
d
⌋
∑
j
=
1
⌊
m
k
d
⌋
i
j
k
d
2
=\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}ijkd^2
=k=1∑min(n,m)d=1∑min(⌊dn⌋,⌊dm⌋)μdi=1∑⌊kdn⌋j=1∑⌊kdm⌋ijkd2
k
,
d
2
k,d^2
k,d2置:
=
∑
k
=
1
min
(
n
,
m
)
∑
d
=
1
min
(
⌊
n
d
⌋
,
⌊
m
d
⌋
)
μ
d
d
2
k
∑
i
=
1
⌊
n
k
d
⌋
∑
j
=
1
⌊
m
k
d
⌋
i
j
=\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_dd^2k\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}ij
=k=1∑min(n,m)d=1∑min(⌊dn⌋,⌊dm⌋)μdd2ki=1∑⌊kdn⌋j=1∑⌊kdm⌋ij
设
S
=
∑
i
=
1
n
∑
i
=
1
n
i
j
S=\sum_{i=1}^n\sum_{i=1}^{n}ij
S=∑i=1n∑i=1nij
因为
∑
i
=
1
n
∑
i
=
1
n
i
j
=
n
(
n
+
1
)
2
\sum_{i=1}^n\sum_{i=1}^{n}ij=\frac{n(n+1)}{2}
∑i=1n∑i=1nij=2n(n+1)
所以有:
S
=
n
(
n
+
1
)
2
S=\frac{n(n+1)}{2}
S=2n(n+1)
则上式变为:
=
∑
k
=
1
min
(
n
,
m
)
∑
d
=
1
min
(
⌊
n
d
⌋
,
⌊
m
d
⌋
)
μ
d
d
2
k
S
⌊
n
k
d
⌋
S
⌊
m
k
d
⌋
=\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_dd^2kS_{\lfloor\frac{n}{kd}\rfloor}S_{\lfloor\frac{m}{kd}\rfloor}
=k=1∑min(n,m)d=1∑min(⌊dn⌋,⌊dm⌋)μdd2kS⌊kdn⌋S⌊kdm⌋
现在就可以
Θ
(
n
n
)
\Theta(n\sqrt{n})
Θ(nn)出解了。
你发现式子太长了,不和谐,于是用
T
=
k
d
T=kd
T=kd代替一下,同时
i
=
k
,
j
=
d
i=k,j=d
i=k,j=d,得:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
∑
i
j
=
T
i
j
2
μ
j
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{ij=T}ij^2\mu_j
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋ij=T∑ij2μj
因为
i
j
=
T
ij=T
ij=T,所以有:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
∑
i
j
=
T
T
j
μ
j
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{ij=T}Tj\mu_j
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋ij=T∑Tjμj
w
o
c
woc
woc后面的式子
i
i
i不见了,那就等价于
j
∣
T
j|T
j∣T,得:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
∑
j
∣
T
T
j
μ
j
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{j|T}Tj\mu_j
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋j∣T∑Tjμj
等价于:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
⋅
i
d
T
⋅
∑
j
∣
T
i
d
j
⋅
μ
j
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·id_T·\sum_{j|T}id_j·\mu_j
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋⋅idT⋅j∣T∑idj⋅μj
由于一个数
×
1
\times1
×1得原数,因此等价于:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
⋅
i
d
T
⋅
∑
j
∣
T
i
d
j
⋅
μ
j
⋅
I
T
j
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·id_T·\sum_{j|T}id_j·\mu_j·I_{\frac{T}{j}}
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋⋅idT⋅j∣T∑idj⋅μj⋅IjT
等价于:
=
∑
T
=
1
min
(
n
,
m
)
S
⌊
n
T
⌋
S
⌊
m
T
⌋
⋅
(
i
d
⋅
(
i
d
⋅
μ
∗
I
)
)
(
T
)
=\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·(id·(id·\mu*I))(T)
=T=1∑min(n,m)S⌊Tn⌋S⌊Tm⌋⋅(id⋅(id⋅μ∗I))(T)
考虑
i
d
⋅
(
i
d
⋅
μ
∗
I
)
id·(id·\mu*I)
id⋅(id⋅μ∗I)怎么杜教筛。
i
d
⋅
(
(
i
d
⋅
μ
)
∗
I
)
id·((id·\mu)*I)
id⋅((id⋅μ)∗I)
若
A
A
A为完全积性函数,有
A
⋅
(
B
∗
C
)
=
A
⋅
B
∗
A
⋅
C
A·(B*C)=A·B*A·C
A⋅(B∗C)=A⋅B∗A⋅C,所以将
(
i
d
⋅
μ
)
(id·\mu)
(id⋅μ)看为一个整体,有:
=
(
i
d
⋅
μ
⋅
i
d
)
∗
(
I
⋅
i
d
)
=(id·\mu·id)*(I·id)
=(id⋅μ⋅id)∗(I⋅id)
=
(
i
d
2
⋅
μ
)
∗
(
I
⋅
i
d
)
=(id^2·\mu)*(I·id)
=(id2⋅μ)∗(I⋅id)
我们选择
i
d
2
id^2
id2进行狄利克雷卷积。
设
f
=
(
i
d
2
⋅
μ
)
∗
(
I
⋅
i
d
)
f=(id^2·\mu)*(I·id)
f=(id2⋅μ)∗(I⋅id),
g
=
i
d
2
g=id^2
g=id2,
S
u
m
=
∑
f
Sum=\sum{f}
Sum=∑f,则有:
考虑
f
∗
g
=
(
i
d
2
⋅
μ
)
∗
(
I
⋅
i
d
)
∗
i
d
2
=
f
∗
g
=
(
i
d
2
⋅
μ
)
∗
i
d
∗
i
d
2
f*g=(id^2·\mu)*(I·id)*id^2=f*g=(id^2·\mu)*id*id^2
f∗g=(id2⋅μ)∗(I⋅id)∗id2=f∗g=(id2⋅μ)∗id∗id2。
因为狄利克雷卷积满足交换律,因此有:
f
∗
g
=
(
i
d
2
⋅
μ
)
∗
i
d
2
∗
i
d
f*g=(id^2·\mu)*id^2*id
f∗g=(id2⋅μ)∗id2∗id
(
(
i
d
2
⋅
μ
)
∗
i
d
2
)
(
i
)
((id^2·\mu)*id^2)(i)
((id2⋅μ)∗id2)(i)
∑
j
∣
i
j
2
⋅
μ
j
⋅
(
n
j
)
2
\sum_{j|i}j^2·\mu_j·(\frac{n}{j})^2
∑j∣ij2⋅μj⋅(jn)2
∑
j
∣
i
n
2
⋅
μ
j
\sum_{j|i}n^2·\mu_j
∑j∣in2⋅μj
=
n
2
∑
j
∣
i
⋅
μ
j
=n^2\sum_{j|i}·\mu_j
=n2∑j∣i⋅μj
=
n
2
[
n
=
1
]
=n^2[n=1]
=n2[n=1]
=
1
=1
=1
即
(
(
i
d
2
⋅
μ
)
∗
i
d
2
)
(
i
)
=
I
((id^2·\mu)*id^2)(i)=I
((id2⋅μ)∗id2)(i)=I,带回去,得到:
f
∗
g
=
(
i
d
2
⋅
μ
)
∗
i
d
2
∗
i
d
=
I
∗
i
d
=
i
d
f*g=(id^2·\mu)*id^2*id=I*id=id
f∗g=(id2⋅μ)∗id2∗id=I∗id=id
杜教筛是这么处理积性函数的:
g
(
1
)
∗
S
u
m
(
n
)
=
∑
i
=
1
n
(
f
∗
g
)
(
i
)
−
∑
i
=
2
n
g
(
i
)
S
u
m
(
⌊
n
i
⌋
)
g(1)*Sum(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)Sum(\lfloor\frac{n}{i} \rfloor)
g(1)∗Sum(n)=i=1∑n(f∗g)(i)−i=2∑ng(i)Sum(⌊in⌋)
= ∑ i = 1 n i − ∑ i = 2 n i 2 S u m ( ⌊ n i ⌋ ) =\sum_{i=1}^{n}i-\sum_{i=2}^{n}i^2Sum(\lfloor\frac{n}{i} \rfloor) =i=1∑ni−i=2∑ni2Sum(⌊in⌋)
= n ( n + 1 ) 2 − ∑ i = 2 n i 2 S u m ( ⌊ n i ⌋ ) =\frac{n(n+1)}{2}-\sum_{i=2}^{n}i^2Sum(\lfloor\frac{n}{i} \rfloor) =2n(n+1)−i=2∑ni2Sum(⌊in⌋)
现在可以整除分块了,自然就可以杜教筛了。
考虑如何线性筛。
(
f
)
(
1
)
=
(
i
d
2
⋅
μ
)
∗
i
d
(f)(1)=(id^2·\mu)*id
(f)(1)=(id2⋅μ)∗id
=
1
=1
=1
设
p
∈
p
r
i
m
e
p∈prime
p∈prime。
(
f
)
(
p
)
=
(
i
d
2
⋅
μ
)
∗
i
d
(f)(p)=(id^2·\mu)*id
(f)(p)=(id2⋅μ)∗id
=
∑
i
∣
p
i
d
i
2
⋅
μ
i
⋅
i
d
p
i
=\sum_{i|p}id_i^2·\mu_i·id_{\frac{p}i}
=∑i∣pidi2⋅μi⋅idip
=
∑
i
∣
p
i
2
⋅
μ
i
⋅
p
i
=\sum_{i|p}i^2·\mu_i·\frac{p}{i}
=∑i∣pi2⋅μi⋅ip
=
∑
i
∣
p
i
p
μ
i
=\sum_{i|p}ip\mu_i
=∑i∣pipμi
=
p
−
p
2
=p-p^2
=p−p2
=
p
(
1
−
p
)
=p(1-p)
=p(1−p)
(
f
)
(
p
k
)
=
(
i
d
2
⋅
μ
)
∗
i
d
(f)(p^k)=(id^2·\mu)*id
(f)(pk)=(id2⋅μ)∗id
=
∑
i
∣
p
k
i
d
i
2
⋅
μ
i
⋅
i
d
p
i
=\sum_{i|p^k}id_i^2·\mu_i·id_{\frac{p}i}
=∑i∣pkidi2⋅μi⋅idip
=
∑
i
∣
p
k
i
2
⋅
μ
i
⋅
p
k
i
=\sum_{i|p^k}i^2·\mu_i·\frac{p^k}{i}
=∑i∣pki2⋅μi⋅ipk
=
∑
i
∣
p
k
i
p
k
μ
i
=\sum_{i|p^k}ip^k\mu_i
=∑i∣pkipkμi
=
p
k
−
p
k
+
1
=p^k-p^{k+1}
=pk−pk+1
=
p
k
(
1
−
p
)
=p^k(1-p)
=pk(1−p)
可以
Θ
(
1
)
\Theta(1)
Θ(1)求,就可以线性筛了。
代码:
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#define LL long long
#define MAXN 10000000
#define mod 1000000007
#define inv2 500000004
#define inv6 166666668
using namespace std;
LL n;
int t=0;
int prime[MAXN],low[MAXN];
LL f[MAXN];
bool bz[MAXN];
void init(int ma)
{
f[0]=0,f[1]=1;
bz[0]=bz[1]=true;
for(int i=2;i<=ma;i++)
{
if(!bz[i]) prime[++t]=low[i]=i,f[i]=((LL)i*(1-i)%mod+mod)%mod;
for(int j=1;j<=t&&i*prime[j]<=ma;j++)
{
bz[i*prime[j]]=true;
if(!(i%prime[j]))
{
low[i*prime[j]]=low[i]*prime[j];
if(low[i]==i)
f[i*prime[j]]=((((1ll-prime[j])*i%mod+mod)%mod)*prime[j]%mod+mod)%mod;
else
f[i*prime[j]]=(f[i/low[i]]*f[low[i]*prime[j]]%mod+mod)%mod;
break;
}
f[i*prime[j]]=f[i]*f[prime[j]]%mod;
low[i*prime[j]]=prime[j];
}
}
for(int i=1;i<=ma;i++)
f[i]=(f[i]+f[i-1]+mod)%mod;
}
LL calc_2(LL x)
{
x%=mod;
return x*(x+1)%mod*inv2%mod;
}
LL calc_6(LL x)
{
x%=mod;
return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
map<LL,LL> Sum;
LL calc(LL n)
{
if(n<=MAXN-10) return f[n];
{
map<LL,LL>::iterator t=Sum.find(n);
if(t!=Sum.end()) return t->second;
}
LL ans=calc_2(n);
for(LL l=2,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans-(calc_6(r)-calc_6(l-1)+mod)%mod*calc(n/l)%mod+mod)%mod;
}
return Sum[n]=ans;
}
LL work()
{
LL ans=0;
for(LL l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans+calc_2(n/l)*calc_2(n/l)%mod*(calc(r)-calc(l-1)+mod)%mod)%mod;
}
return ans;
}
LL dg(LL x,LL k)
{
if(!k) return 1;
LL op=dg(x,k>>1);
if(k&1) return op*op%mod*x%mod; else return op*op%mod;
}
int main()
{
scanf("%lld",&n);
init(MAXN-10);
printf("%lld",work());
}