#include #include using namespace std; using mint = atcoder::modint998244353; mint exp_all(int n) { mint e = 0; for (int i = 1; i <= n; i++) { e += mint(n) / i; } return e; } void solve() { int N, L; cin >> N >> L; set D; for (int i = 0; i < N; i++) { int d; cin >> d; D.insert(d); } if (L % 2 == 1) { cout << exp_all(N).val() << "\n"; return; } int diameters = 0, normals = 0; for (int d: D) { int opposition = (d + L / 2) % L; D.contains(opposition) ? diameters++ : normals++; } diameters /= 2; if (diameters <= 1) { cout << exp_all(N).val() << "\n"; return; } vector dp(3, vector(diameters + 1, vector(normals + 1, 0))); for (int i = 1; i >= 0; i--) { for (int j = diameters; j >= 0; j--) { for (int k = normals; k >= 0; k--) { mint remain = N - i - j - k; dp[i][j][k] = mint(i + j + k) / remain; if (i < j) { dp[i][j][k] += (dp[i + 1][j][k] + 1) * (j - i) / remain; } if (j < diameters) { dp[i][j][k] += (dp[i][j + 1][k] + 1) * 2 * (diameters - j) / remain; } if (k < normals) { dp[i][j][k] += (dp[i][j][k + 1] + 1) * (normals - k) / remain; } } } } cout << dp[0][0][0].val() << "\n"; } int main() { int T; cin >> T; while (T--) solve(); }