#yukicoder570 #A-D 省略 #E #入力受取 Aをソート N, M, K = map(int, input().split()) A = sorted(int(Ai) for Ai in input().split()) MOD = 998244353 #sub[i]: ドミノiとの大きさの差がK以下の[Lt, Rt) sub: list[tuple[int, int]] = [(0, 0)] * N for i in range(N): for Lt in range(i - 1, -2, -1): if Lt == -1 or abs(A[Lt] - A[i]) > K: break Lt += 1 for Rt in range(i + 1, N + 1, +1): if Rt == N or abs(A[Rt] - A[i]) > K: break sub[i] = (Lt, Rt) #累積和DP DP: list[int] = [1] * N C: list[int] = [0] * (N + 1) for _ in range(M - 1): for i in range(N): C[i + 1] = (C[i] + DP[i]) % MOD for i, (Lt, Rt) in enumerate(sub): DP[i] = C[Rt] - C[Lt] ans: int = sum(DP) % MOD if ans < 0: ans += MOD print(ans)