首先
ϕ
(
i
j
)
\phi(ij)
ϕ(ij)怎么拆?这里要用到一个不怎么常见的套路,
ϕ
(
i
j
)
=
ϕ
(
i
)
ϕ
(
j
)
gcd
(
i
,
j
)
ϕ
(
gcd
(
i
,
j
)
)
\phi(ij)=\frac{\phi(i)\phi(j)\gcd(i,j)}{\phi(\gcd(i,j))}
ϕ(ij)=ϕ(gcd(i,j))ϕ(i)ϕ(j)gcd(i,j)。
让我们观察这个式子:
∑
d
=
1
n
d
ϕ
(
d
)
∑
i
=
1
n
∑
j
=
1
n
ϕ
(
i
)
ϕ
(
j
)
[
gcd
(
i
,
j
)
=
d
]
dist(i,j)
\sum_{d=1}^n\frac{d}{\phi(d)}\sum_{i=1}^n\sum_{j=1}^n\phi(i)\phi(j)[\gcd(i,j)=d]\text{dist(i,j)}
∑d=1nϕ(d)d∑i=1n∑j=1nϕ(i)ϕ(j)[gcd(i,j)=d]dist(i,j)
首先
ϕ
(
i
)
ϕ
(
j
)
\phi(i)\phi(j)
ϕ(i)ϕ(j)可以看成两个点权之积,其次后面的艾佛森括号表示的是“恰好”的意思,那么我们可以想到将条件改写成
i
,
j
i,j
i,j均为
d
d
d的倍数。
考察:
∑
d
∣
i
∑
d
∣
j
ϕ
(
i
)
ϕ
(
j
)
dist(i,j)
\sum_{d|i}\sum_{d|j}\phi(i)\phi(j)\text{dist(i,j)}
∑d∣i∑d∣jϕ(i)ϕ(j)dist(i,j) 这个式子不就可以在虚树上统计答案吗?
那么我们只需容斥即可。记
g
(
d
)
=
∑
d
∣
i
∑
d
∣
j
ϕ
(
i
)
ϕ
(
j
)
dist(i,j)
g(d)=\sum_{d|i}\sum_{d|j}\phi(i)\phi(j)\text{dist(i,j)}
g(d)=∑d∣i∑d∣jϕ(i)ϕ(j)dist(i,j),
f
(
d
)
=
∑
i
=
1
n
∑
j
=
1
n
ϕ
(
i
)
ϕ
(
j
)
[
gcd
(
i
,
j
)
=
d
]
dist(i,j)
f(d)=\sum_{i=1}^n\sum_{j=1}^n\phi(i)\phi(j)[\gcd(i,j)=d]\text{dist(i,j)}
f(d)=∑i=1n∑j=1nϕ(i)ϕ(j)[gcd(i,j)=d]dist(i,j)。那么
g
(
d
)
=
∑
d
∣
d
′
f
(
d
′
)
g(d)=\sum_{d|d'}f(d')
g(d)=∑d∣d′f(d′),显然可以得到
f
(
d
)
=
∑
d
∣
d
′
g
(
d
′
)
μ
(
d
′
d
)
f(d)=\sum_{d|d'}g(d')\mu(\frac{d'}{d})
f(d)=∑d∣d′g(d′)μ(dd′),因此只需计算
g
(
d
)
g(d)
g(d)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」