import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.TreeMap;
public class Main {
public static void main
(String[] args
) { try {
int t
= Integer.
parseInt(br.
readLine()); int n = 0, k = 0;
Integer value
= 0, reqCnt
= 0, demand
= 0; HashMap
<Integer, Integer
> reqCntTable
= new HashMap
<Integer, Integer
>();
for (int i = 0; i < t; i++) {
reqCntTable.clear();
table.clear();
data = br.readLine().split(" ");
data = br.readLine().split(" ");
if (k == 1) {
continue;
}
for (int j = 0; j < n; j++) {
key = data[j].trim();
value
= table.
get(Integer.
parseInt(key
)); if (value == null) {
value = 0;
}
value++;
value = value % k;
table.
put(Integer.
parseInt(key
), value
);
}
Collection<Integer> boquey = table.values();
ArrayList<Integer> heights = new ArrayList<Integer>(boquey);
int hlen=heights.size();
while(iterator.hasNext()){
demand = (k -table.get(keyStr));
reqCnt = reqCntTable.get(demand);
if (reqCnt == null) {
reqCnt = 1;
}else{
reqCnt++;
}
reqCntTable.put(demand, reqCnt);
}
long result = 0L;
int len = heights.size();
int freePool = 0, cpool = 0;
int j = 0;
int bqCnt=0;
int reqAux = 0,req=0;
for (j = len - 1; j > 0; j--) {
cpool = heights.get(j);
reqAux = k - cpool;
available = reqCntTable.get(cpool);
if((available != null)&&(available==1)){
available--;
reqCntTable.put(cpool, available);
req=k-cpool;
if(req<=freePool){
freePool-=req;
result += req;
continue;
}
}
if ((available != null) && (available >0)) {
int index=heights.indexOf(reqAux);
heights.set(index, 0);
result+=cpool;
available--;
reqCntTable.put(cpool, available);
reqAux = k - cpool;
available = reqCntTable.get(reqAux);
available--;
reqCntTable.put(reqAux, available);
}else{
freePool += cpool;
bqCnt=freePool/k;
freePool=freePool%k;
result+=(k-1)*bqCnt;
}
}
bqCnt=freePool/k;
freePool=freePool%k;
result+=(k-1)*bqCnt;
result += freePool;
table.clear();
}
}
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7IGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOyBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsgaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7IGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsgaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOyBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOyBpbXBvcnQgamF2YS51dGlsLlNldDsgaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CiAgICAgICAgICAgIGludCB0ID0gSW50ZWdlci5wYXJzZUludChici5yZWFkTGluZSgpKTsKICAgICAgICAgICAgaW50IG4gPSAwLCBrID0gMDsKICAgICAgICAgICAgU3RyaW5nIGtleSA9IG51bGw7CiAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSAwLCByZXFDbnQgPSAwLCBkZW1hbmQgPSAwOwogICAgICAgICAgICBUcmVlTWFwPEludGVnZXIsIEludGVnZXI+IHRhYmxlID0gbmV3IFRyZWVNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKICAgICAgICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiByZXFDbnRUYWJsZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgICAgICAgIFN0cmluZyBkYXRhW10gPSBudWxsOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0OyBpKyspIHsKICAgICAgICAgICAgICAgIHJlcUNudFRhYmxlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB0YWJsZS5jbGVhcigpOwogICAgICAgICAgICAgICAgZGF0YSA9IGJyLnJlYWRMaW5lKCkuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgIG4gPSBJbnRlZ2VyLnBhcnNlSW50KGRhdGFbMF0pOwogICAgICAgICAgICAgICAgayA9IEludGVnZXIucGFyc2VJbnQoZGF0YVsxXSk7CgogICAgICAgICAgICAgICAgZGF0YSA9IGJyLnJlYWRMaW5lKCkuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgIGlmIChrID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgICAgICAgIGtleSA9IGRhdGFbal0udHJpbSgpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGFibGUuZ2V0KEludGVnZXIucGFyc2VJbnQoa2V5KSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFsdWUrKzsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICUgazsKICAgICAgICAgICAgICAgICAgICB0YWJsZS5wdXQoSW50ZWdlci5wYXJzZUludChrZXkpLCB2YWx1ZSk7CgoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW50ZWdlcj4gYm9xdWV5ID0gdGFibGUudmFsdWVzKCk7CiAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gaGVpZ2h0cyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oYm9xdWV5KTsKICAgICAgICAgICAgICAgIGludCBobGVuPWhlaWdodHMuc2l6ZSgpOwoKICAgICAgICAgICAgICAgIFNldCBrZXlzPXRhYmxlLmtleVNldCgpOwogICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3I9a2V5cy5pdGVyYXRvcigpOwogICAgICAgICAgICAgICAgSW50ZWdlciBrZXlTdHI9MDsKCiAgICAgICAgICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewogICAgICAgICAgICAgICAgICAgIGtleVN0cj0oSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIGRlbWFuZCA9IChrIC10YWJsZS5nZXQoa2V5U3RyKSk7CiAgICAgICAgICAgICAgICAgICAgcmVxQ250ID0gcmVxQ250VGFibGUuZ2V0KGRlbWFuZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUNudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNudCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXFDbnRUYWJsZS5wdXQoZGVtYW5kLCByZXFDbnQpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICBsb25nIHJlc3VsdCA9IDBMOwogICAgICAgICAgICAgICAgaW50IGxlbiA9IGhlaWdodHMuc2l6ZSgpOwogICAgICAgICAgICAgICAgaW50IGZyZWVQb29sID0gMCwgY3Bvb2wgPSAwOwogICAgICAgICAgICAgICAgSW50ZWdlciBhdmFpbGFibGUgPSAwOwogICAgICAgICAgICAgICAgaW50IGogPSAwOwogICAgICAgICAgICAgICAgaW50IGJxQ250PTA7CiAgICAgICAgICAgICAgICBpbnQgcmVxQXV4ID0gMCxyZXE9MDsKCiAgICAgICAgICAgICAgICBmb3IgKGogPSBsZW4gLSAxOyBqID4gMDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgY3Bvb2wgPSBoZWlnaHRzLmdldChqKTsKICAgICAgICAgICAgICAgICAgICByZXFBdXggPSBrIC0gY3Bvb2w7CiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gcmVxQ250VGFibGUuZ2V0KGNwb29sKTsKICAgICAgICAgICAgICAgICAgICBpZigoYXZhaWxhYmxlICE9IG51bGwpJiYoYXZhaWxhYmxlPT0xKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS0tOwogICAgICAgICAgICAgICAgICAgICAgICByZXFDbnRUYWJsZS5wdXQoY3Bvb2wsIGF2YWlsYWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcT1rLWNwb29sOwogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXE8PWZyZWVQb29sKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVQb29sLT1yZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcmVxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKChhdmFpbGFibGUgIT0gbnVsbCkgJiYgKGF2YWlsYWJsZSA+MCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4PWhlaWdodHMuaW5kZXhPZihyZXFBdXgpOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRzLnNldChpbmRleCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCs9Y3Bvb2w7CiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS0tOwogICAgICAgICAgICAgICAgICAgICAgICByZXFDbnRUYWJsZS5wdXQoY3Bvb2wsIGF2YWlsYWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcUF1eCA9IGsgLSBjcG9vbDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gcmVxQ250VGFibGUuZ2V0KHJlcUF1eCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS0tOwogICAgICAgICAgICAgICAgICAgICAgICByZXFDbnRUYWJsZS5wdXQocmVxQXV4LCBhdmFpbGFibGUpOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBmcmVlUG9vbCArPSBjcG9vbDsKICAgICAgICAgICAgICAgICAgICAgICAgYnFDbnQ9ZnJlZVBvb2wvazsKICAgICAgICAgICAgICAgICAgICAgICAgZnJlZVBvb2w9ZnJlZVBvb2wlazsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kz0oay0xKSpicUNudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnFDbnQ9ZnJlZVBvb2wvazsKICAgICAgICAgICAgICAgIGZyZWVQb29sPWZyZWVQb29sJWs7CiAgICAgICAgICAgICAgICByZXN1bHQrPShrLTEpKmJxQ250OwoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmcmVlUG9vbDsKICAgICAgICAgICAgICAgIHRhYmxlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgfQoKICAgIH0KCn0K