codeforces1593 div3:D2 Half of Same
题目描述
给出一个序列
a
1
,
a
2
,
a
3
,
.
.
.
.
,
a
n
a_1,a_2,a_3,....,a_n
a1,a2,a3,....,an
请你找到一个
k
k
k 使得用
k
k
k 去减去任意的
a
i
a_i
ai
最后满足序列中至少有一半的值相等
题解
要满足至少一半的数相等,那么这个
k
k
k 肯定是被选择的这一半的数中最小的数与其他数的所有差值的最小公共因子。
那么我们只要枚举这个最小的数
m
i
n
_
n
u
m
min\_num
min_num ,范围是
[
1
,
(
n
/
2
+
1
)
]
[1,(n/2+1)]
[1,(n/2+1)]
然后与所有比它大的数值做差,找出数值最大的出现次数超过
n
n
n 的一半的因子。
那么如何找到这个满足条件的最大的因子呢?
假设差值是
x
x
x ,那么只要枚举
[
1
,
x
]
[1,\sqrt x]
[1,x],如果
x
m
o
d
i
=
=
0
x \quad mod\quad i==0
xmodi==0 那么
i
i
i与
x
/
i
x/i
x/i 都是满足条件的因子,我们用一个桶记录这些因子出现的次数。
然后我们找出所有次数大于
n
n
n 的一半的数中的最大值。
有一些特殊情况,要特判
1)在对每一个差值
x
x
x 进行分解因子时,每个因子被记录的出现次数(插桶次数)不超过1次
2) 当前枚举到的
m
i
n
_
n
u
m
min\_num
min_num ,如果有多个与其相等的数,那么只要出现的次数只要大于
n
n
n 的一半减去与
m
i
n
_
n
u
m
min\_num
min_num 相等数的个数。
文中所提到的
n
n
n 的一半均为
n
/
2
−
1
n/2-1
n/2−1