Codeforces Round #653 (Div. 3)
Zero Remainder Array
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array a consisting of n positive integers.
Initially, you have an integer x=0. During one move, you can do one of the following two operations:
Choose exactly one i from 1 to n and increase ai by x (ai:=ai+x), then increase x by 1 (x:=x+1).
Just increase x by 1 (x:=x+1).
The first operation can be applied no more than once to each i from 1 to n.
Your task is to find the minimum number of moves required to obtain such an array that each its element is divisible by k (the value k is given).
You have to answer t independent test cases.
Input
The first line of the input contains one integer t (1≤t≤2⋅104) — the number of test cases. Then t test cases follow.
The first line of the test case contains two integers n and k (1≤n≤2⋅105;1≤k≤109) — the length of a and the required divisior. The second line of the test case contains n integers a1,a2,…,an (1≤ai≤109), where ai is the i-th element of a.
It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).
Output
For each test case, print the answer — the minimum number of moves required to obtain such an array that each its element is divisible by k.
Example
input
5
4 3
1 2 1 3
10 6
8 7 1 8 3 7 5 10 8 9
5 10
20 100 50 20 100500
10 25
24 24 24 24 24 24 24 24 24 24
8 8
1 2 3 4 5 6 7 8
output
6
18
0
227
8
Note
Consider the first test case of the example:
x=0, a=[1,2,1,3]. Just increase x;
x=1, a=[1,2,1,3]. Add x to the second element and increase x;
x=2, a=[1,3,1,3]. Add x to the third element and increase x;
x=3, a=[1,3,3,3]. Add x to the fourth element and increase x;
x=4, a=[1,3,3,6]. Just increase x;
x=5, a=[1,3,3,6]. Add x to the first element and increase x;
x=6, a=[6,3,3,6]. We obtained the required array.
Note that you can't add x to the same element more than once.
唉
写的一晚上bug
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
int a[200005];
struct g {
int number, count;
bool operator<(g b) {
if (count == b.count) return number > b.number;
return count < b.count;
}
} ge[200005];
int main() {
#ifdef LOCAL
freopen("zz_in.txt", "r", stdin);
freopen("zz_op.txt", "w", stdout);
#endif
unsigned long long ans;
int i, t, n, k, p;
cin >> t;
while (t--) {
ans = 0;
cin >> n >> k;
for (i = 0; i < n; i++) {
cin >> a[i];
}
for (i = 0; i < n; i++)
a[i] = a[i] % k;
sort(a, a + n);
p = 0;
ge[p].number = a[0];
ge[p].count = 0;
for (i = 0; i < n; i++) {
if (a[i] == ge[p].number)
ge[p].count++;
else {
p++;
ge[p].count = 1;
ge[p].number = a[i];
}
}
p++;
sort(ge, ge + p);
if (ge[p - 1].number == 0) {
if (p == 1)
cout << "0" << endl;
else {
ans = ge[p - 2].count * k - ge[p - 2].number + 1;
cout << ans << endl;
}
} else {
ans = ge[p - 1].count * k - ge[p - 1].number + 1;
cout << ans << endl;
}
}
#ifdef LOCAL
printf("Time used = %.2f\n", (double) clock() / CLOCKS_PER_SEC);
#endif
return 0;
}
自己造了几组数,明明没问题啊
本来卡test2,结果把好几十行的循环换了个结构体,又卡test 5,醉了
// if (a[i] == 0) continue;
// if (a[i] == temp) {
// cishu_temp++;
// if (i == n - 1) {
// zuiduo = temp;
// cishu = cishu_temp;
// if (cishu_temp > cishu) {
// zuiduo = temp;
// cishu = cishu_temp;
// cishu_temp = 1;
// temp = a[i];
// continue;
// }
// if (cishu_temp == cishu) {
// if (temp < zuiduo) {
// zuiduo = temp;
// cishu_temp = 1;
// temp = a[i];
// } else {
// cishu_temp = 1;
// temp = a[i];
// }
// continue;
// }
// if (cishu_temp < cishu) {
// cishu_temp = 1;
// temp = a[i];
// }
// }
// } else {
// if (cishu_temp > cishu) {
// zuiduo = temp;
// cishu = cishu_temp;
// cishu_temp = 1;
// temp = a[i];
// continue;
// }
// if (cishu_temp == cishu) {
// if (temp < zuiduo) {
// zuiduo = temp;
// cishu_temp = 1;
// temp = a[i];
// } else {
// cishu_temp = 1;
// temp = a[i];
// }
// continue;
// }
// if (cishu_temp < cishu) {
// cishu_temp = 1;
// temp = a[i];
// }
// }
// }
// if (a[0] == a[n - 1]) {
// if (a[0] == 0) {
// cout << "0" << endl;
// continue;
// }
// zuiduo = a[0];
// cishu = n;
// }