#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> D(N); for(int i = 0; i < N; i++){ int mae = lower_bound(A.begin(),A.end(),A[i]-K) - A.begin(); int ato = prev(lower_bound(A.begin(),A.end(),A[i]+K+1)) - A.begin(); D[i] = {mae,ato+1}; //1-indexed用にずらしておく } //3.DP vector> dp(M,vector(N+1)); //dp配列 vector> DP(M,vector(N+1)); //dp配列の累積和 for(int i = 0; i < M; i++){ for(int j = 1; j <= N; j++){ if(i == 0) dp[i][j] = 1; if(i != 0) dp[i][j] = (DP[i-1][D[j-1].second] - DP[i-1][D[j-1].first]) % 998244353; } for(int j = 1; j <= N; j++){ DP[i][j] = (DP[i][j-1] + dp[i][j]) % 998244353; } } //4.答えの出力 cout << DP[M-1][N] << "\n"; }