最快相同
题号:NC288603
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}现在有一个由 n 个整数组成的数组 \{a_1, a_2, \dots, a_n\},你可以进行以下操作任意次(可以是 0 次):
\hspace{23pt}\bullet\,每次操作恰好选择 k 个不同的位置,并使这些位置上的元素值减一;形式地说,每次操作可以选择一个大小为 k 的集合 S = \{p_1, p_2, \dots, p_k\},对于集合中的每个元素都使得 a_{p_i} \rightarrow a_{p_i} - 1
\hspace{15pt}现在,你想要将整个数组的元素都变为相同值,求解最少需要的操作次数。特别地,如果无论怎样操作都无法使得数组所有元素都变为相同值,则直接输出 -1

输入描述:

\hspace{15pt}第一行输入两个整数 n,k \left(1\le k \le n \le 10^5 \right) 代表数组中的元素个数、单次操作的位置数。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n \left(1\le a_i \le 10^9 \right) 代表数组中的元素。

输出描述:

\hspace{15pt}如果不存在一种操作方案,使得数组所有元素变为相同值,输出 -1。否则,输出一个整数,代表最少操作次数。
示例1

输入

复制
3 2
1 1 2

输出

复制
2

说明

\hspace{15pt}在这个样例中,每一次的操作如下:
\hspace{23pt}\bullet\,第一次操作选择位置 23,数组变为 \{1, 0, 1\}
\hspace{23pt}\bullet\,第二次操作选择位置 13,数组变为 \{0, 0, 0\}
\hspace{15pt}我们可以证明,这是最少需要的操作次数。
示例2

输入

复制
4 4
1 1 1 2

输出

复制
-1