#include #include #include #include #include #include using std::vector; using std::pair; int k; vector< pair > numbers; void Init() { int n; assert(scanf("%d%d", &n, &k) == 2); vector a(n); for (int i = 0; i < n; ++i) { assert(scanf("%d", &a[i]) == 1); } std::sort(a.begin(), a.end()); a.push_back(INT_MAX); // Count the number of all integers that appeared in the array numbers.clear(); int last_number = a[0]; int cnt = 0; for (int num : a) { if (num != last_number) { numbers.push_back({last_number, cnt}); cnt = 0; last_number = num; } ++cnt; } } int Count(pair a, pair b) { if (a == b) return a.second * (a.second - 1); else return a.second * b.second; } void Work() { int ans = INT_MAX; int ans_cnt = 0; auto it = numbers.end(); for (pair num : numbers) { // Find the corresponding position of integer and update the answer while (it != numbers.begin() && (it - 1)->first + num.first >= k) --it; for (auto iter = std::max(it - 2, numbers.begin()); iter < std::min(it + 2, numbers.end()); ++iter) { if (iter != numbers.end()) { if (abs(num.first + iter->first - k) < ans && !(num == *iter && num.second == 1)) { ans = abs(num.first + iter->first - k); ans_cnt = 0; } if (abs(num.first + iter->first - k) == ans) ans_cnt += Count(num, *iter); } } } printf("%d %d\n", ans, ans_cnt / 2); } int main() { int cases; assert(scanf("%d", &cases) == 1); while (cases--) { Init(); Work(); } return 0; }