#![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); } //初項A_j以下の列の個数 let mut pre = vec![0;N+1]; let mut now = vec![0;N+1]; for i in 0..=N {now[i] = i;} for _ in 2..=M{ pre = now.clone(); for i in 1..=N{ now[i]=(MOD+now[i-1]+pre[r[i]]-pre[l[i]])%MOD; } } //eprintln!("{:?}",dp); println!("{}",now[N]); }