#include #include #include #include #include #include using namespace atcoder; using namespace std; using ll = long long; using ull = unsigned long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; ll ll_min = numeric_limits::min(); ll ll_max = numeric_limits::max(); ll ALPHABET_N = 26; using mint = modint998244353; // using mint = modint1000000007; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define all(a) a.begin(), a.end() using i128 = __int128_t; int main() { ll n, m, k; cin >> n >> m >> k; vector A(n); rep(i, n) cin >> A[i]; sort(all(A)); vector dp(n, 1); rep(i, m - 1) { vector ndp(n, 0); rep(j, n) { auto sit = lower_bound(all(A), A[j] - k); auto eit = upper_bound(all(A), A[j] + k); ll s = sit - A.begin(), e = eit - A.begin(); ndp[s] += dp[j]; if (e < n) ndp[e] -= dp[j]; } rep_(j, 1, n) ndp[j] = ndp[j - 1] + ndp[j]; swap(dp, ndp); } mint ans = accumulate(all(dp), mint(0)); cout << ans.val() << endl; return 0; }