using s64 = longlong; using u64 = unsignedlonglong;
/* 取 min */ template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } /* 取 max */ template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
/* ----- ----- ----- 正文 ----- ----- ----- */
constint N = 100100;
constint mod = 998244353; // 模数需根据实际问题调整
/* 模意义下 加法 */ inlinevoidadd(int &x, constint &y){ x += y; if (x >= mod) { x -= mod; } }
/* 模意义下 减法 */ inlinevoiddec(int &x, constint &y){ x -= y; if (x < 0) { x += mod; } }
/* 模意义下 乘法 */ inlinevoidmul(int &x, constint &y){ x = 1ll * x * y % mod; }
/* 快速幂 */ intqpow(int a, int b, int p){ int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = 1ll * ans * a % p; a = 1ll * a * a % p; } return ans; }
constint V = 3e5, MaxV = V * 2 + 10;
int n, m, k;
structBinomCoef { std::vector<int> fact, facv;
voidinit(constint &n){ fact.resize(n + 1), facv.resize(n + 1); fact[0] = 1; for (int i = 1; i <= n; i ++) { fact[i] = 1ll * fact[i - 1] * i % mod; }
facv[n] = qpow(fact[n], mod - 2, mod); for (int i = n - 1; i >= 0; i --) { facv[i] = 1ll * facv[i + 1] * (i + 1) % mod; } }
intbinom(int n, int m){ if (n < m || m < 0) { return0; } return1ll * facv[m] * facv[n - m] % mod * fact[n] % mod; } } bc;
int pre[MaxV];
intwalk(int x, int l, int r){ if (x <= l) { int s = l - x, e = r - x; int sum = pre[e]; if (s) dec(sum, pre[s - 1]); return sum; } elseif (x >= r) { int s = x - r, e = x - l; int sum = pre[e]; if (s) dec(sum, pre[s - 1]); return sum; } else { int sum = 0; add(sum, pre[r - x]), add(sum, pre[x - l]), dec(sum, pre[0]); return sum; } }
intcalc(std::vector<int> &a){ int mi = *std::min_element(a.begin() + 1, a.end()), ma = *std::max_element(a.begin() + 1, a.end()); int le = std::max(-V, ma - m - k), rg = std::min(V, mi + m); int ans = 0; for (int l = le; l <= rg; l ++) { int v1 = 1, v2 = 1; for (int i = 1; i <= n; i ++) { mul(v1, walk(a[i], l, l + k)); mul(v2, walk(a[i], l + 1, l + k)); } add(ans, v1); dec(ans, v2); } return ans; }