#include using namespace std; static const long long MOD = 998244353; tuple find_interval(const vector& a, long long lo, long long hi) { if (a.empty() || lo > a.back() || hi < a.front()) { return {0, -1, -1}; } int l = lower_bound(a.begin(), a.end(), lo) - a.begin(); int r = upper_bound(a.begin(), a.end(), hi) - a.begin() - 1; if (l > r) return {0, -1, -1}; return {r - l + 1, l, r}; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; long long K; cin >> N >> M >> K; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; sort(A.begin(), A.end()); vector l_inds(N), r_inds(N); for (int i = 0; i < N; i++) { auto [cnt, l, r] = find_interval(A, A[i] - K, A[i] + K); l_inds[i] = l; r_inds[i] = r; } vector dp(N, 1), pp(N); for (int iter = 0; iter < M - 1; iter++) { fill(pp.begin(), pp.end(), 0); swap(dp, pp); vector acc(N); acc[0] = pp[0] % MOD; for (int i = 1; i < N; i++) { acc[i] = (acc[i - 1] + pp[i]) % MOD; } for (int j = 0; j < N; j++) { int l = l_inds[j]; int r = r_inds[j]; if (l != -1) { long long val = acc[r]; if (l > 0) val = (val - acc[l - 1] + MOD) % MOD; dp[j] = (dp[j] + val) % MOD; } } } long long ans = 0; for (int i = 0; i < N; i++) { ans = (ans + dp[i]) % MOD; } cout << ans << '\n'; return 0; }