D. Split Plus K
每个测试的时间限制:1 秒
内存限制:256 兆字节
黑板上有 n 个正整数 a1,a2,…,an。同时给定一个正整数 k。你可以执行以下操作任意次(可能为零次):
- 在黑板上选择一个数 x;
- 擦除一个 x;
- 写上两个正整数 y,z,满足 y+z=x+k。
问:是否可能使得黑板上所有数都相等?如果可能,最少需要多少次操作?
输入格式
每个测试包含多个测试用例。第一行包含整数 t(1≤t≤104)——测试用例的数量。接下来是每个测试用例的描述:
- 第一行包含两个整数 n,k(1≤n≤2⋅105,1≤k≤1012)——初始黑板上数的个数以及常数 k。
- 第二行包含 n 个整数 a1,a2,…,an(1≤ai≤1012)——初始黑板上数的状态。
保证所有测试用例的 n 之和不超过 2⋅105。
输出格式
对于每个测试用例,输出一行一个整数:使黑板上所有数相等所需的最少操作次数,若不可能则输出 −1。
样例输入
9
2 1
3 4
2 3
7 11
3 10
100 40 100
2 1
1 2
2 2
1 2
1 327869541
327869541
5 26250314066
439986238782 581370817372 409476934981 287439719777 737637983182
5 616753575719
321037808624 222034505841 214063039282 441536506916 464097941819
5 431813672576
393004301966 405902283416 900951084746 672201172466 518769038906
样例输出
3
1
4
-1
-1
0
3119
28999960732
-1
样例解释
第一个测试用例:k=1。可以通过以下操作使所有数变成 2:
- 擦除 x=4,写上 (y,z)=(2,3)。注意 y+z=x+k。此时黑板上的多重集为 {3,2,3}。
- 擦除 x=3,写上 (y,z)=(2,2)。黑板变为 {2,2,2,3}。
- 擦除 x=3,写上 (y,z)=(2,2)。黑板变为 {2,2,2,2,2}。
共 3 次操作。可以证明无法用少于 3 次操作达成。
第二个测试用例:k=3。一次操作即可使所有数变成 7:
- 擦除 x=11,写上 (y,z)=(7,7)。黑板变为 {7,7,7}。
第三个测试用例:k=10。可以通过 4 次操作使所有数变成 40:
- 擦除 x=100,写上 (y,z)=(70,40)。黑板变为 {70,40,40,100}。
- 擦除 x=70,写上 (y,z)=(40,40)。黑板变为 {40,40,40,40,100}。
- 擦除 x=100,写上 (y,z)=(40,70)。黑板变为 {40,40,40,40,40,70}。
- 擦除 x=70,写上 (y,z)=(40,40)。黑板变为 {40,40,40,40,40,40,40}。
第四、第五个测试用例:可以证明不可能使所有数相等。