use std::collections::HashMap; use std::io::{self, Read}; const MOD: i64 = 998244353; fn main() { // ---- read all ---- let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); let mut it = input.split_whitespace(); let n: usize = it.next().unwrap().parse().unwrap(); let m: usize = it.next().unwrap().parse().unwrap(); let k: i64 = it.next().unwrap().parse().unwrap(); let mut a_map: HashMap = HashMap::new(); for _ in 0..n { let a: i64 = it.next().unwrap().parse().unwrap(); *a_map.entry(a).or_insert(0) += 1; } // 座標圧縮 let mut value_list: Vec = a_map.keys().cloned().collect(); value_list.sort(); let value_max = value_list.len(); // dp 初期化 let mut dp = vec![0i64; value_max]; let mut base = vec![0i64; value_max]; for (i, &v) in value_list.iter().enumerate() { let c = a_map[&v] % MOD; dp[i] = c; base[i] = c; } // 第二バッファ let mut ndp = vec![0i64; value_max]; // M 回遷移 for _step in 1..m { let mut low = 0usize; let mut high = 0usize; let mut cum_d = dp[0]; for i in 0..value_max { let a0 = value_list[i]; // low を進める while low < i && a0 - value_list[low] > k { cum_d = (cum_d - dp[low]) % MOD; if cum_d < 0 { cum_d += MOD; } low += 1; } // high を進める while high + 1 < value_max && value_list[high + 1] <= a0 + k { high += 1; cum_d = (cum_d + dp[high]) % MOD; } ndp[i] = (cum_d * base[i]) % MOD; } // バッファを swap して次ループへ std::mem::swap(&mut dp, &mut ndp); } // 最終結果 let mut ans = 0i64; for v in dp.iter() { ans = (ans + v) % MOD; } println!("{}", ans); }