#![allow(unused)] #![allow(non_snake_case)] #![allow(dead_code)] pub fn bsearch_irange(mut l: usize, mut r: usize, f: F) -> usize where F: Fn(usize) -> bool, { while l < r { let m = l + (r - l) / 2; if f(m) { r = m; } else { l = m + 1; } } l } fn main() { let input_str = std::io::read_to_string(std::io::stdin()).unwrap(); let mut input = input_str.split_whitespace(); let mut read_int = ||->usize {input.next().unwrap().parse().unwrap()}; const MOD:usize = 998244353; let (N,M,K)=(read_int(),read_int(),read_int()); let mut A:Vec = (0..N).map(|_| read_int()).collect(); A.sort(); let mut l = vec![0;N+1]; let mut r = vec![0;N+1]; for i in 0..N{ l[i+1] = bsearch_irange(0,N,|j| A[j]+K >= A[i]); r[i+1] = bsearch_irange(0,N,|j| A[j] > A[i]+K); } //dp[i][j]:長さi,初項A_j以下の列の個数 let mut dp = vec![vec![0;N+1];M+1]; for j in 0..=N {dp[1][j] = j;} for i in 2..=M{ for j in 1..=N{ dp[i][j]=(MOD+dp[i][j-1]+dp[i-1][r[j]]-dp[i-1][l[j]])%MOD; } } //eprintln!("{:?}",dp); println!("{}",dp[M][N]); }