//セグ木での実装 with チャッピー #include using namespace std; const int MOD = 998244353; // ======================== // Fenwick木 (BIT) // ======================== struct Fenwick { int n; vector bit; Fenwick(int n_): n(n_), bit(n_+1, 0) {} void update(int i, int x) { for (++i; i <= n; i += i & -i) { bit[i] += x; if (bit[i] >= MOD) bit[i] -= MOD; } } int sum(int i) { // [0, i) int res = 0; for (; i > 0; i -= i & -i) { res += bit[i]; if (res >= MOD) res -= MOD; } return res; } int query(int l, int r) { // [l, r) int res = sum(r) - sum(l); if (res < 0) res += MOD; return res; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, K; cin >> N >> M >> K; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; // --- 前処理 --- sort(A.begin(), A.end()); vector> D(N); for (int i = 0; i < N; i++) { int mae = lower_bound(A.begin(), A.end(), A[i] - K) - A.begin(); int ato = lower_bound(A.begin(), A.end(), A[i] + K + 1) - A.begin(); D[i] = {mae, ato}; } // --- DP --- vector dp(N, 1); // 初期状態(長さ1の列はすべて1通り) vector newdp(N); for (int step = 1; step < M; step++) { Fenwick bit(N); for (int i = 0; i < N; i++) bit.update(i, dp[i]); for (int j = 0; j < N; j++) newdp[j] = bit.query(D[j].first, D[j].second); dp.swap(newdp); } // --- 答え出力 --- int ans = 0; for (int x : dp) { ans += x; if (ans >= MOD) ans -= MOD; } cout << ans << "\n"; }