#line 1 "main.cpp" #include using namespace std; #include #include using namespace atcoder; #line 6 "/home/hidehic0/src/github.com/hidehic0/library_cpp/templates/alias.hpp" template using VC = std::vector; using ll = long long; using ld = long double; using pii = std::pair; using vi = VC; using vvi = VC; using vvvi = VC; using vb = VC; using vvb = VC; using vf = VC; using vvf = VC; using vpii = VC; using vvpii = VC; using si = std::set; using spii = std::set; using mii = std::map; const std::string upperlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const std::string lowerlist = "abcdefghijklmnopqrstuvwxyz"; #define mp make_pair #define dms << " " << constexpr int MOD998 = 998244353; #line 4 "/home/hidehic0/src/github.com/hidehic0/library_cpp/templates/macro.hpp" #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for (int i = n - 1; i >= 0; i--) #define REP(i, a, b) for (int i = (int)(a); i < (int)(b); ++i) #define RREP(i, a, b) for (int i = (int)(b - 1); i >= (int)(a); i--) #define all(a) (a).begin(), (a).end() template bool chmin(T &a, T b) { if (a > b) { a = b; return true; } return false; } template bool chmax(T &a, T b) { if (a < b) { a = b; return true; } return false; } inline void input() {} template void input(H &h, T &...t) { std::cin >> h; input(t...); } template void input(std::vector &v) { for (int i = 0; i < v.size(); i++) { std::cin >> v[i]; } } inline void out() { std::cout << "\n"; } template void out(H &h, T &...t) { std::cout << h << " "; out(t...); } template void out(std::vector v) { for (int i = 0; i < v.size(); i++) { std::cout << v[i] << (i + 1 == v.size() ? "\n" : " "); } } template inline T ceil_div(T a, T b) { return (a + b - 1) / b; } template inline T mod_pow(T a, T n, T mod) { T res = 1; while (n) { if (n % 2 != 0) { res *= a; res %= mod; } a *= a; a %= mod; n >>= 1; } return res; } #line 9 "main.cpp" using mint = modint998244353; mint op(mint a, mint b) { return a + b; } mint e() { return 0; } int main() { ll N, M, K; cin >> N >> M >> K; vi A(N), L(N), R(N); input(A); sort(all(A)); rep(i, N) { L[i] = lower_bound(all(A), A[i] - K) - A.begin(); R[i] = upper_bound(all(A), A[i] + K) - A.begin(); } segtree seg(VC(N, 1)); rep(_, M - 1) { vector nxt(N); rep(i, N) { nxt[i] = seg.prod(L[i], R[i]); } rep(i, N) { seg.set(i, nxt[i]); } } cout << seg.all_prod().val() << "\n"; }