# Time Complexity O(wlogw)
from bisect import *
def getRange(lval, rval, a): # returns (leftmost occurrence of lval, rightmost occurrence of rval)
# 'Find leftmost item greater than or equal to x'
i = bisect_left(a, lval)
# 'Find rightmost value less than or equal to x'
j = bisect_right(a, rval)-1
return (i, j)
def calMod(val, l, r, a): # calculate abs(a[l]-val) + abs(a[l+1]-val) ... abs(a[r-1]-val) + abs(a[r]-val) in log(w)
if a[r] <= val:
return abs(getSum(a, l, r) - val*(r-l+1))
elif a[l] >= val :
return abs(getSum(a, l, r) - val*(r-l+1))
else:
# 'Find rightmost value less than or equal to x'
j = bisect_right(a, val)-1
# return calMod(val, l, j, a) + calMod(val, j+1, r, a)
return abs(getSum(a, l, j) - val*(j-l+1)) + abs(getSum(a, j+1, r) - val*(r-j))
def getSum(a, l, r): # calculate a[l] + a[l+1] ... a[r-1] + a[r] in O(1)
return total - (left_sum[l-1] if l else 0) - (right_sum[r+1] if r+1 < len(right_sum) else 0)
t = int(input())
for ti in range(t):
w, n = [int(var) for var in input().split()]
a = [int(var) for var in input().split()]
a.sort();ans = float("inf")
total = sum(a)
left_sum, right_sum = a[:], a[:]
for i in range(1, w):
left_sum[i] += left_sum[i-1]
for i in reversed(range(w-1)):
right_sum[i] += right_sum[i+1]
for v in a:
lval, rval = max(1, (2*v - n)/2), min(n, (2*v + n)/2)
l,r = getRange(lval, rval, a)
moves = calMod(v, l, r, a)
if l :
moves += abs(calMod(v, 0, l-1, a) - l*n)
if w-(r+1):
moves += abs(calMod(v, r+1, w-1, a) - (w-r-1)*n)
ans = min(ans, moves)
print("Case #%d: %d"%(ti+1, ans))
IyBUaW1lIENvbXBsZXhpdHkgTyh3bG9ndykKCmZyb20gYmlzZWN0IGltcG9ydCAqCgpkZWYgZ2V0UmFuZ2UobHZhbCwgcnZhbCwgYSk6ICMgcmV0dXJucyAobGVmdG1vc3Qgb2NjdXJyZW5jZSBvZiBsdmFsLCByaWdodG1vc3Qgb2NjdXJyZW5jZSBvZiBydmFsKQoJIyAnRmluZCBsZWZ0bW9zdCBpdGVtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB4JwoJaSA9IGJpc2VjdF9sZWZ0KGEsIGx2YWwpCgkjICdGaW5kIHJpZ2h0bW9zdCB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geCcKCWogPSBiaXNlY3RfcmlnaHQoYSwgcnZhbCktMQoJcmV0dXJuIChpLCBqKQoKCmRlZiBjYWxNb2QodmFsLCBsLCByLCBhKTogIyBjYWxjdWxhdGUgYWJzKGFbbF0tdmFsKSArIGFicyhhW2wrMV0tdmFsKSAuLi4gYWJzKGFbci0xXS12YWwpICsgYWJzKGFbcl0tdmFsKSBpbiBsb2codykKCWlmIGFbcl0gPD0gdmFsOgoJCXJldHVybiBhYnMoZ2V0U3VtKGEsIGwsIHIpIC0gdmFsKihyLWwrMSkpCgllbGlmIGFbbF0gPj0gdmFsIDoKCQlyZXR1cm4gYWJzKGdldFN1bShhLCBsLCByKSAtIHZhbCooci1sKzEpKQoJZWxzZToKCQkjICdGaW5kIHJpZ2h0bW9zdCB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geCcKCQlqID0gYmlzZWN0X3JpZ2h0KGEsIHZhbCktMQoJCSMgcmV0dXJuIGNhbE1vZCh2YWwsIGwsIGosIGEpICsgY2FsTW9kKHZhbCwgaisxLCByLCBhKQoJCXJldHVybiBhYnMoZ2V0U3VtKGEsIGwsIGopIC0gdmFsKihqLWwrMSkpICsgYWJzKGdldFN1bShhLCBqKzEsIHIpIC0gdmFsKihyLWopKQoKCgpkZWYgZ2V0U3VtKGEsIGwsIHIpOiAjIGNhbGN1bGF0ZSBhW2xdICsgYVtsKzFdIC4uLiBhW3ItMV0gKyBhW3JdIGluIE8oMSkKCXJldHVybiB0b3RhbCAtIChsZWZ0X3N1bVtsLTFdIGlmIGwgZWxzZSAwKSAtIChyaWdodF9zdW1bcisxXSBpZiByKzEgPCBsZW4ocmlnaHRfc3VtKSBlbHNlIDApCgp0ID0gaW50KGlucHV0KCkpCgpmb3IgdGkgaW4gcmFuZ2UodCk6Cgl3LCBuID0gW2ludCh2YXIpIGZvciB2YXIgaW4gaW5wdXQoKS5zcGxpdCgpXQoJYSA9IFtpbnQodmFyKSBmb3IgdmFyIGluIGlucHV0KCkuc3BsaXQoKV0KCglhLnNvcnQoKTthbnMgPSBmbG9hdCgiaW5mIikKCgl0b3RhbCA9IHN1bShhKQoKCWxlZnRfc3VtLCByaWdodF9zdW0gPSBhWzpdLCBhWzpdCgoJZm9yIGkgaW4gcmFuZ2UoMSwgdyk6CgkJbGVmdF9zdW1baV0gKz0gbGVmdF9zdW1baS0xXQoKCWZvciBpIGluIHJldmVyc2VkKHJhbmdlKHctMSkpOgoJCXJpZ2h0X3N1bVtpXSArPSByaWdodF9zdW1baSsxXQoKCWZvciB2IGluIGE6CgkJbHZhbCwgcnZhbCA9IG1heCgxLCAoMip2IC0gbikvMiksIG1pbihuLCAoMip2ICsgbikvMikKCQlsLHIgPSBnZXRSYW5nZShsdmFsLCBydmFsLCBhKQoJCW1vdmVzID0gY2FsTW9kKHYsIGwsIHIsIGEpCgkJaWYgbCA6IAoJCQltb3ZlcyArPSBhYnMoY2FsTW9kKHYsIDAsIGwtMSwgYSkgLSBsKm4pCgkJaWYgdy0ocisxKToKCQkJbW92ZXMgKz0gYWJzKGNhbE1vZCh2LCByKzEsIHctMSwgYSkgLSAody1yLTEpKm4pCgkJYW5zID0gbWluKGFucywgbW92ZXMpCgoJcHJpbnQoIkNhc2UgIyVkOiAlZCIlKHRpKzEsIGFucykpCg==