Dirchlet前缀和和Dirchlet后缀和基础知识可以查阅blog学习一下,以前一直用不知道叫这名……其实本质也就是质因数分解以后指数的高维前缀和……
cnt[i]表示{a[i]}中i的倍数的个数,dp[i]表示选出i的倍数的数,前缀gcd的和最大是多少
显然前缀gcd一定是前一个前缀gcd因子,所以dp[i]要么等于i * cnt[i]要么一定存在某个位置前缀gcd为j,使得j为i的倍数,dp[i]=max{dp[j]+i*(cnt[i]-cnt[j])},一定是前面gcd是个i倍数,后面填了一些i的倍数非j的倍数使得gcd缩小为i
b
[
a
[
x
]
]
=
1
,
c
n
t
[
i
]
=
∑
i
∣
j
b
[
j
]
b[a[x]]=1, cnt[i]=\sum_{i | j}{b[j]}
b[a[x]]=1,cnt[i]=i∣j∑b[j] 这是很标准的Dirchlet后缀和形式
d
p
[
i
]
=
min
i
∣
j
(
d
p
[
j
]
+
i
∗
(
c
n
t
[
i
]
−
c
n
t
[
j
]
)
)
dp[i]=\min_{i|j}{(dp[j]+i*(cnt[i]-cnt[j]))}
dp[i]=i∣jmin(dp[j]+i∗(cnt[i]−cnt[j])) ,是不是感觉很像,求和与取min都满足,同样做法
O
(
V
l
o
g
l
o
g
V
)
O(V loglogV)
O(VloglogV)
最后 输出任意
d
p
[
i
]
{
i
∣
g
c
d
(
a
[
1
]
,
a
[
2
]
.
.
.
a
[
n
]
)
}
dp[i]\left\{ i|gcd(a[1],a[2]...a[n]) \right\}
dp[i]{i∣gcd(a[1],a[2]...a[n])},直接dp[1]就行了
Dirchlet后缀和的应用 Codeforces 1614D2
最新推荐文章于 2022-03-14 01:47:58 发布