CF1909D Split Plus K
题目描述
[eliteLAQ - Desert Ruins](https://soundcloud.com/lux-gg-198448038/desert-ruins)
⠀
黑板上有 $n$ 个正整数 $a_1, a_2, \dots, a_n$。你还得到一个正整数 $k$。你可以进行如下操作若干次(可以为 $0$ 次):
- 选择黑板上的一个数 $x$;
- 擦去 $x$ 的一个出现;
- 在黑板上写下两个正整数 $y$、$z$,满足 $y+z = x+k$。
你能否通过若干次操作使黑板上的所有数都相等?如果可以,最少需要多少次操作?
输入格式
每组测试数据包含多个测试用例。第一行包含测试用例数量 $t$($1 \le t \le 10^4$)。接下来是每个测试用例的描述。
每个测试用例的第一行包含两个整数 $n$ 和 $k$($1 \le n \le 2 \cdot 10^5$,$1 \leq k \leq 10^{12}$),分别表示黑板上初始数字的个数和常数 $k$。
每个测试用例的第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \le a_i \le 10^{12}$),表示黑板的初始状态。
保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。
输出格式
对于每个测试用例,输出一行一个整数:使黑板上所有数字相等所需的最小操作次数。如果无法做到,输出 $-1$。
说明/提示
在第一个测试用例中,$k=1$。你可以通过以下操作使黑板上所有数字变为 $2$:
- 擦去 $x=4$,写下 $(y, z) = (2, 3)$。注意 $y+z=x+k$。此时黑板为 $\{3, 2, 3\}$。
- 擦去 $x=3$,写下 $(y, z) = (2, 2)$。注意 $y+z=x+k$。此时黑板为 $\{2, 2, 2, 3\}$。
- 擦去 $x=3$,写下 $(y, z) = (2, 2)$。注意 $y+z=x+k$。此时黑板为 $\{2, 2, 2, 2, 2\}$。
这样共进行了 $3$ 次操作。可以证明无法用更少的操作使所有数字相等。
在第二个测试用例中,$k=3$。你可以通过以下操作使黑板上所有数字变为 $7$:
- 擦去 $x=11$,写下 $(y, z) = (7, 7)$。注意 $y+z=x+k$。此时黑板为 $\{7, 7, 7\}$。
在第三个测试用例中,$k=10$。你可以通过以下操作使黑板上所有数字变为 $40$:
- 擦去 $x=100$,写下 $(y, z) = (70, 40)$。注意 $y+z=x+k$。此时黑板为 $\{70, 40, 40, 100\}$。
- 擦去 $x=70$,写下 $(y, z) = (40, 40)$。注意 $y+z=x+k$。此时黑板为 $\{40, 40, 40, 40, 100\}$。
- 擦去 $x=100$,写下 $(y, z) = (40, 70)$。注意 $y+z=x+k$。此时黑板为 $\{40, 40, 40, 40, 40, 70\}$。
- 擦去 $x=70$,写下 $(y, z) = (40, 40)$。注意 $y+z=x+k$。此时黑板为 $\{40, 40, 40, 40, 40, 40, 40\}$。
在第四和第五个测试用例中,可以证明无法使所有数字相等。
由 ChatGPT 4.1 翻译