#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
#define debug printf("(hao)")
#define all(x) x.begin(), x.end()
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define clr(a, v) memset(a, v, sizeof(a))
void solve() {
long long n, k;
scanf("%lld%lld", &n, &k);
vll arr;
rep(i, 0, n) {
long long tmp;
scanf("%lld", &tmp);
if (tmp % k != 0) //如果这个数不能被 k 整除
arr.push_back(k - tmp % k); //对于每个数把最少加多少能被 k 整除的数放到数组里
}
if (arr.empty()) {//如果数组的数都能被 k 整除,操作次数就使 0
printf("0\n");
return;
}
sort(all(arr));
long long Max = 1, w = arr[0];
int len = arr.size();
for (int i = 1; i < len;) { //求最大众数,方法比较蠢
int sen = 1; //计算出现个数
if (arr[i] == arr[i - 1]) {
while (arr[i] == arr[i - 1] && i < len) {
sen++;
i++;
}
} else {
i++;
}
if (Max <= sen) Max = sen, w = arr[i - 1];//如果出现次数比之前算的要多
}
printf("%lld\n", w + k * (Max - 1) + 1);
}
// #define LOCAL
int main() {
std::ios::sync_with_stdio(false);
#ifdef LOCAL
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
int T;
scanf("%d", &T);
while (T--)
solve();
return 0;
}
653 div3 problemD. Zero Remainder Array题解(数学 + 思维 + 排序)
传送门题意给你一个长度为 n 的数组ana_nan,和一个 k,你有一个 x(一开始为0),你有以下两种操作给 x 加上 1,即x=x+1x = x + 1x=x+1选择一个任意一个aia_iai(0≤i<n0 \le i < n0≤i<n)加上 x,然后 x 加上 1每个元素最多只能被执行一次上诉操作问你执行上述操作,x 最小为多少可以使得数组所有元素都能整除 k思路记录数组的每一个数至少要加多少才可以被 k 整除寻找上述数中的最大的众数,计算 x 加到