#include using namespace std; static const long long MOD = 998244353; 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()); // mA[j]: A[j] のときに選べる最小 index // MA[j]: A[j] のときに選べる最大 index vector mA(N), MA(N); for (int i = 0; i < N; i++) { long long val = A[i]; int l = lower_bound(A.begin(), A.end(), val - K) - A.begin(); int r = upper_bound(A.begin(), A.end(), val + K) - A.begin() - 1; // right inclusive mA[i] = l; MA[i] = r; } vector dp(N, 1), new_dp(N, 0); for (int i = 0; i < M - 1; i++) { // 累積和 acc_dp[j] = dp[0] + dp[1] + ... + dp[j] vector acc_dp(N); acc_dp[0] = dp[0]; for (int j = 1; j < N; j++) { acc_dp[j] = (acc_dp[j - 1] + dp[j]) % MOD; } for (int j = 0; j < N; j++) { int l = mA[j]; int r = MA[j]; if (l == 0) { new_dp[j] = acc_dp[r]; } else { new_dp[j] = (acc_dp[r] - acc_dp[l - 1] + MOD) % MOD; } } dp = new_dp; fill(new_dp.begin(), new_dp.end(), 0LL); } long long ans = 0; for (long long x : dp) ans = (ans + x) % MOD; cout << ans << "\n"; return 0; }