use std::io::{self, Read}; const MOD: i64 = 998244353; fn main() { // 入力の高速読み込み 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: Vec = (0..n) .map(|_| it.next().unwrap().parse().unwrap()) .collect(); // A.sort() a.sort(); // MAX 配列 let mut max_idx = vec![0usize; n]; let mut ind = 0usize; for i in 0..n { while ind < n && a[ind] - a[i] <= k { ind += 1; } max_idx[i] = ind; } // MIN 配列 let mut min_idx = vec![0usize; n]; ind = 0; for i in 0..n { while ind < n && a[i] - a[ind] > k { ind += 1; } min_idx[i] = ind; } // DP 初期化 let mut dp = vec![1i64; n]; // DP 遷移を M-1 回 for _ in 0..(m - 1) { // 累積和 S let mut s = vec![0i64; n + 1]; for i in 0..n { s[i + 1] = (s[i] + dp[i]) % MOD; } // 次の DP let mut next_dp = vec![0i64; n]; for j in 0..n { let val = s[max_idx[j]] - s[min_idx[j]]; next_dp[j] = (val % MOD + MOD) % MOD; } dp = next_dp; } // 答え let ans: i64 = dp.iter().fold(0, |acc, &x| (acc + x) % MOD); println!("{}", ans); }