#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()); vector L(N), R(N); for (int i = 0; i < N; i++) { L[i] = lower_bound(A.begin(), A.end(), A[i] - K) - A.begin(); R[i] = upper_bound(A.begin(), A.end(), A[i] + K) - A.begin() - 1; } // 長さ1の列:どの種類のドミノで終わっても1通り vector dp(N, 1), ndp(N), pref(N + 1); for (int len = 1; len < M; len++) { pref[0] = 0; for (int i = 0; i < N; i++) { pref[i + 1] = (pref[i] + dp[i]) % MOD; } for (int i = 0; i < N; i++) { ndp[i] = pref[R[i] + 1] - pref[L[i]]; if (ndp[i] < 0) ndp[i] += MOD; } dp.swap(ndp); } long long ans = 0; for (int i = 0; i < N; i++) { ans += dp[i]; ans %= MOD; } cout << ans << '\n'; return 0; }