#include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) mint op(mint a, mint b){ return a+b; } mint e(){return 0;} using p = pair; int main(){ int n, m, k; cin >> n >> m >> k; vi a(n); rep(i, n)cin >> a[i]; sort(all(a)); vector

vp(n); rep(i, n){ int s; if(a[i] - a[0] <= k){ s = 0; }else{ int l = 0, r = i; int mid; while(r-l>1){ mid = (l+r)/2; if(a[i] - a[mid] <= k){ r = mid; }else{ l = mid; } } s = r; } int t; if(a[n-1] - a[i] <= k){ t = n-1; }else{ int l = i, r = n-1; int mid; while(r-l>1){ mid = (l+r)/2; if(a[n-1] - a[mid] <= k){ l = mid; }else{ r = mid; } } t = l; } vp[i] = {s, t}; } segtree seg(n); vector> vs(2, seg); rep(i, n)vs[0].set(i, mint(1)); rep2(i, 1, m){ int c = i%2; rep(j, n){ auto [l, r] = vp[j]; vs[c].set(j, vs[1-c].prod(l, r+1)); } }cout << vs[(m-1)%2].all_prod().val() << endl; return 0; }