## https://yukicoder.me/problems/no/3376 MOD = 998244353 def solve_case_all_black(N): dp = [0] * (N + 1) for i in reversed(range(N)): dp[i] = (N * pow(N - i, MOD - 2, MOD)) % MOD dp[i] += dp[i + 1] dp[i] %= MOD return dp[0] def solve(N, L, D): if L % 2 != 0: return solve_case_all_black(N) d_map = {} for i in range(N): d = D[i] d_map[d] = i diameter_pair = 0 for i in range(N): d = D[i] d1 = (d + L // 2) % L if d1 in d_map: diameter_pair += 1 del d_map[d] del d_map[d1] if diameter_pair <= 1: return solve_case_all_black(N) # 異なる4つが存在して rest_point = N - 2 * diameter_pair dp1 = [0] * diameter_pair dp1[diameter_pair - 1] = N * pow(N - (rest_point + diameter_pair + 1), MOD - 2, MOD) dp1[diameter_pair - 1] %= MOD for i in reversed(range(diameter_pair - 1)): dp1[i] = N * pow(N - (rest_point + i + 2), MOD - 2, MOD) dp1[i] %= MOD p = 2 * (diameter_pair - 1 - i) p %= MOD p *= pow(N - (rest_point + i + 2), MOD - 2, MOD) p %= MOD p *= dp1[i + 1] p %= MOD dp1[i] += p dp1[i] %= MOD dp0 = [0] * (diameter_pair + 1) dp0[diameter_pair] = N * pow(N - (rest_point + diameter_pair), MOD - 2, MOD) dp0[diameter_pair] %= MOD q = diameter_pair q %= MOD q *= pow(N - (rest_point + diameter_pair), MOD - 2, MOD) q %= MOD q *= dp1[diameter_pair - 1] q %= MOD dp0[diameter_pair] += q dp0[diameter_pair] %= MOD for i in reversed(range(diameter_pair)): dp0[i] = N * pow(N - (rest_point + i), MOD - 2, MOD) dp0[i] %= MOD p = 2 * (diameter_pair - i) p %= MOD p *= pow(N - (rest_point + i), MOD - 2, MOD) p %= MOD p *= dp0[i + 1] p %= MOD dp0[i] += p dp0[i] %= MOD q = i q %= MOD q *= pow(N - (rest_point + i), MOD - 2, MOD) q %= MOD q *= dp1[i - 1] q %= MOD dp0[i] += q dp0[i] %= MOD return dp0[0] def main(): T = int(input()) answers = [] for _ in range(T): N, L = map(int, input().split()) D = list(map(int, input().split())) ans = solve(N, L, D) answers.append(ans) for ans in answers: print(ans) if __name__ == "__main__": main()