#include using namespace std; int N,M,K; signed main(){ //1.入力の受取り cin>>N>>M>>K; vector A(N); for(int i = 0; i < N; i++) cin>>A[i]; //2.二分探索の前計算 sort(A.begin(),A.end()); vector L(N); vector R(N); for(int i = 0; i < N; i++){ L[i] = lower_bound(A.begin(),A.end(),A[i]-K) - A.begin(); R[i] = prev(lower_bound(A.begin(),A.end(),A[i]+K+1)) - A.begin(); R[i]++; //1-indexed用にずらしておく } //3.DP vector dp1(N+1); //dp配列 vector dp2(N+1); //dp配列 vector DP1(N+1); //dp配列の累積和 vector DP2(N+1); //dp配列の累積和 for(int i = 0; i < M; i++){ for(int j = 1; j <= N; j++){ if(i == 0){dp1[j] = 1;} else dp1[j] = (DP1[R[j-1]] - DP1[L[j-1]] + 998244353) % 998244353; } for(int j = 1; j <= N; j++){ DP1[j] = (DP1[j-1] + dp1[j]) % 998244353; } } //4.答えの出力 cout << DP1[N] << "\n"; }