← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	var k int64
	fmt.Fscan(reader, &n, &k)

	a := make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	b := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		b[i] = a[n-i]
	}

	MOD := int64(998244353)

	fact := make([]int64, n+1)
	fact[0] = 1
	for i := 1; i <= n; i++ {
		fact[i] = fact[i-1] * int64(i) % MOD
	}

	invFact := make([]int64, n+1)
	invFact[n] = modInverse(fact[n], MOD)
	for i := n - 1; i >= 0; i-- {
		invFact[i] = invFact[i+1] * int64(i+1) % MOD
	}

	L_arr := make([]int, n+1)
	L := 0
	for i := 1; i <= n; i++ {
		for L+1 < i && b[L+1] > b[i]+k {
			L++
		}
		L_arr[i] = L
	}

	P := make([]int64, n+1)
	W := make([]int64, n+1)
	P[1] = 1
	W[1] = 1

	for i := 2; i <= n; i++ {
		Li := L_arr[i]
		W[i] = P[Li] * fact[i-2] % MOD
		Vi := W[i] * invFact[i-1] % MOD
		P[i] = (P[i-1] + Vi) % MOD
	}

	R_arr := make([]int, n+1)
	ptr := 1
	for i := 1; i <= n; i++ {
		if ptr < i+1 {
			ptr = i + 1
		}
		for ptr <= n && b[i] <= b[ptr]+k {
			ptr++
		}
		if ptr <= n {
			R_arr[i] = ptr
		} else {
			R_arr[i] = -1
		}
	}

	ans := int64(0)
	if n >= 2 && b[1] > b[2]+k {
		ans = (ans + fact[n-1]) % MOD
	}

	for i := 2; i <= n; i++ {
		if W[i] == 0 {
			continue
		}
		Ri := R_arr[i]
		if Ri != -1 {
			term1 := W[i] * fact[n-1] % MOD
			term2 := invFact[i-2] * modInverse(int64(Ri-2), MOD) % MOD
			fw := term1 * term2 % MOD
			ans = (ans + fw) % MOD
		} else {
			term1 := W[i] * fact[n-2] % MOD
			fw := term1 * invFact[i-2] % MOD
			ans = (ans + fw) % MOD
		}
	}

	fmt.Println(ans)
}

func modInverse(a, m int64) int64 {
	var m0, y, x int64 = m, 0, 1
	if m == 1 {
		return 0
	}
	for a > 1 {
		q := a / m
		t := m
		m = a % m
		a = t
		t = y
		y = x - q*y
		x = t
	}
	if x < 0 {
		x += m0
	}
	return x
}