题目
给$N$个数$a_1$到$a_N$,可以进行2种操作:(1)将某个数删去,费用为$x$;(2)将某个数$+1$,费用为$y$。操作(2)可以对一个数操作任意次。问:将这个数列变为空的或者非空但是整个数列的$gcd$不为1的最小费用是多少。
数据范围
$1\le N \le 5\times 10^5\quad 1\le x,y,\le 10^9 \quad 1\le a_i \le 10^6$
做法
枚举整个数列的$gcd$,维护最小的费用。一个优化是,可以将$gcd$按所含有的质数分类,这样枚举质数就行,虽然会重复枚举一些$gcd$,但不会漏。所以,答案是正确的。
假设当前枚举的质数为$p$,那么,我们需要将每个数$a$删掉或者将它变为$kp$,其中$k$是使得$kp\ge a$的最小的$k$(这样+1操作的费用最小)。对于在$[kp+1,(k+1)p]$范围内的数$a$,对其若干次+1操作比删去操作更优,当且仅当$((k+1)p-a)y \le x$。于是操作的分割点为$mid=max(kp+1,\lceil(k+1)p-\frac{x}{y}\rceil)$。对于每个区间的操作的总费用,可以通过前缀和$O(1)$求出。所以总的时间复杂度为枚举的区间的个数,和埃氏筛法复杂度一样$O(NUM\log_2NUM)$。$NUM=max(a_i)$。
代码
|
|
细节
- 在枚举质数的时候,为了保险起见,要枚举到比$max(a_i)$大的第一个质数。
- 前缀和要开$max(a_i)$的2倍大小。
总结
之前对于比$max(a_i)$大的第一个质数会不会称为答案想了很久,但自己太蠢,没想出来。其实根本不需要考虑这个,只要枚举$gcd$的时候把这个也枚举了就行 。毕竟这是程序竞赛,是可以适当暴力的。