请参考这篇博客。
题目
题目概要
有两种操作:
- 删除一个数,代价 x x x 。
- 将该数字增加一,代价 y y y 。
用最少的代价使得所有数字的 gcd \gcd gcd 不为一,或者删除了所有数字。
数据范围与约定
数字个数
n
≤
5
×
1
0
5
n\le 5\times10^5
n≤5×105 且
x
,
y
≤
1
0
9
x,y\le 10^9
x,y≤109 且数字
a
i
∈
(
0
,
1
0
6
]
a_i\in(0,10^6]
ai∈(0,106] 。
思路
考虑 gcd \gcd gcd 中的一个质因子 p p p 即可。
现在我们对于一个区间 ( k p , k p + p ] (kp,kp+p] (kp,kp+p] 的数,我们讨论哪些值需要被增加到 k p + p kp+p kp+p ,剩下的数字删掉。这可以用前缀和快速求(一个求和,一个求数量)。总复杂度是 O ( a ) \mathcal O(a) O(a) 的。
有关复杂度的事儿:调和级数 均摊 为 O ( ln n ) \mathcal O(\ln n) O(lnn) 的,质数个数为 O ( n ln n ) \mathcal O(\frac{n}{\ln n}) O(lnnn) ,所以我们认为 T ( n ) = ∑ p ∈ P O ( ⌊ n p ⌋ ) = O ( n ) T(n)=\sum_{p\in\Bbb P}\mathcal O\left(\left\lfloor\frac{n}{p}\right\rfloor\right)=\mathcal O(n) T(n)=p∈P∑O(⌊pn⌋)=O(n)
其中 P \Bbb P P 是质数集。可是均摊能不能直接用来估计呢? O n l y T i m e W i l l T e l l . \sout{\tt Only\;Time\;Will\;Tell.} OnlyTimeWillTell.
代码
请看文首的代码。