#define int long long constint N = 5e4+10, K=20; int a[N], n, k, L[N],R[N]; int st[K][N], lg2[N];
voidbreakdown(unordered_set<int>& v, int x, int ad){ for (int i = 1; i*i <= x; i++) { if (x % i == 0) { if (1 <= i - ad && i - ad <= k) v.insert(i - ad); if (1 <= x/i - ad && x/i - ad <= k) v.insert(x/i - ad); } } }
intquery(int l, int r){ int k = lg2[r-l+1]; returngcd(st[k][l], st[k][r-(1<<k)+1]); }
voidsolve(){ cin >> n >> k; for (int i = 2; i <= n; i++) lg2[i] = lg2[i>>1] + 1;
int mn = 1e9; for (int i = 1; i <= n; i++) { cin >> a[i]; mn = min(mn, a[i]); }
stack<int> stk; for (int i = 1; i <= n; i++) { while (stk.size() && a[stk.top()] >= a[i]) stk.pop(); if (stk.size()) L[i] = stk.top() + 1; else L[i] = 1; stk.push(i); } stack<int>().swap(stk); for (int i = n; i >= 1; i--) { while (stk.size() && a[stk.top()] >= a[i]) stk.pop(); if (stk.size()) R[i] = stk.top() - 1; else R[i] = n; stk.push(i); } for (int k = 0; k < K; k++) { for (int i = 1; i+(1<<k)-1 <= n; i++) { if (k == 0) st[k][i] = abs(a[i] - a[i-1]); else st[k][i] = gcd(st[k-1][i], st[k-1][i+(1<<(k-1))]); } }
unordered_set<int> ans; if (n == 1) { cout << k << ' ' << 1ll * k * (k+1) / 2 << '\n'; return; }
int g = query(2, n); g = gcd(g, abs(a[1] - mn)); if (g == 0) { cout << k << ' ' << 1ll * k * (k+1) / 2 << '\n'; return; } breakdown(ans, g, mn);
for (int i = 1; i <= n; i++) { if (L[i] == R[i]) continue; g = query(L[i]+1, R[i]); g = gcd(g, abs(a[L[i]] - a[i]));
for (auto it = ans.begin(); it != ans.end(); ) { int x = *it; if (gcd(g, a[i] + x) != a[i] + x) it = ans.erase(it); else it++; } } int sum = 0; for (int x: ans) sum += x; cout << ans.size() << ' ' << sum << '\n'; }
signedmain(){ ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int T; cin >> T; while (T--) solve(); return0; }