#include using namespace std; struct mint{ inline static int64_t mod=998244353; mint():val(0){}mint(const int64_t&v){val=v%mod;if(val<0)val+=mod;} mint&operator+=(const mint&rhs){val+=rhs.val;if(val>=mod)val-=mod;return *this;} mint&operator-=(const mint&rhs){val-=rhs.val;if(val<0)val+=mod;return *this;} mint&operator*=(const mint&rhs){val=val*rhs.val%mod;return *this;} mint&operator/=(const mint&rhs){return *this*=rhs.inv();} mint pow(int64_t n)const{assert(0<=n);mint x=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}return r;} mint inv(void)const{assert(val);return pow(mod-2);}mint operator-(void){return mint()-*this;} friend mint operator+(const mint&lhs,const mint&rhs){return mint(lhs)+=rhs;} friend mint operator-(const mint&lhs,const mint&rhs){return mint(lhs)-=rhs;} friend mint operator*(const mint&lhs,const mint&rhs){return mint(lhs)*=rhs;} friend mint operator/(const mint&lhs,const mint&rhs){return mint(lhs)/=rhs;} friend bool operator==(const mint&lhs,const mint&rhs){return lhs.val==rhs.val;} friend bool operator!=(const mint&lhs,const mint&rhs){return lhs.val!=rhs.val;} friend bool operator<(const mint&lhs,const mint&rhs) {return lhs.val>(std::istream& is,mint&v){int64_t x;is>>x;v.val=x%mod;return is;} friend std::ostream&operator<<(std::ostream& os,const mint&v){return os<> N >> M >> K; vector A(N); for(int i = 0; i < N; ++i) cin >> A[i]; sort(A.begin(), A.end()); vector l(N), r(N); for(int i = 0; i < N; ++i) { l[i] = lower_bound(A.begin(), A.end(), A[i] - K) - A.begin(); r[i] = upper_bound(A.begin(), A.end(), A[i] + K) - A.begin(); } vector dp(N, 1); for(int _ = 2; _ <= M; ++_) { vector dpsum(N + 1, 0); for(int i = 0; i < N; ++i) dpsum[i + 1] = dpsum[i] + dp[i]; for(int i = 0; i < N; ++i) dp[i] = dpsum[r[i]] - dpsum[l[i]]; } mint ans = 0; for(int i = 0; i < N; ++i) ans += dp[i]; cout << ans << "\n"; return 0; }