#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion const int Mod = 998244353; static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var n = I(); var m = I(); var k = I(); var az = Range(n, I); Array.Sort(az); var lz = new int[n]; var rz = new int[n]; lz.AsSpan().Fill(n + 1); rz.AsSpan().Fill(-1); for (var i = 0; i < n; i++) { var a = az[i]; for (var j = 0; j < n; j++) { if (Math.Abs(a - az[j]) > k) continue; lz[i] = Math.Min(lz[i], j); rz[i] = Math.Max(rz[i], j); } } var dp = new long[n]; dp.AsSpan().Fill(1); var sp = new long[n + 1]; for (var i = 1; i <= n; i++) sp[i] = i; for (var _lp = 1; _lp < m; _lp++) { var ep = new long[n]; for (var i = 0; i < n; i++) { var (l, r) = (lz[i], rz[i]); ep[i] = (sp[r + 1] - sp[l] + Mod) % Mod; } dp = ep; for (var i = 1; i <= n; i++) sp[i] = (sp[i - 1] + dp[i - 1]) % Mod; } var ans = sp[n]; Console.WriteLine(ans);