#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2005,V=10005,mod=998244353;
int P[V],FP[V],n,se,a[N],L[N],R[N],b[N],f[N][N],g[N][N],s[N][N],ans;
inline void add(int &x,int y){x+=y;(x>=mod)?(x-=mod):1;}
inline ll power(ll x,ll y){
if(!y) return 1ll;
ll z=power(x,y>>1ll);
z=z*z%mod;
if(y&1ll) return z*x%mod;
return z;
}
inline ll inv(ll x){return power(x,mod-2);}
char *p1,*p2,buf[1000005];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
inline int read(){
register int x=0,f=1;char ch=nc();
while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
while(ch>=48&&ch<=57)x=x*10+ch-48,ch=nc();
return x*f;
}
int main(){
n=read();se=read();
for(int i=1;i<=n;i++) b[i]=read();
for(int i=1;i<=n;i++) L[i]=max(0,b[i]-se);
for(int i=1;i<=n;i++) R[i]=min(i,b[i]+se);
P[0]=FP[0]=1;
for(int i=1;i<=4000;i++) P[i]=(ll)P[i-1]*i%mod;
for(int i=1;i<=4000;i++) FP[i]=inv(P[i]);
g[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++)
for(int k=L[i-1];k<=R[i-1]&&k<=j;k++)
if(g[j][k]){
if(L[i]<=k&&k<=R[i]){
add(f[j][k],(ll)g[j][k]*j%mod);
add(f[j+1][k],g[j][k]);
}
if(k<R[i])
add(s[j+1][max(L[i],k+1)],(ll)g[j][k]*P[j-k]%mod);
}
for(int j=0;j<=i;j++)
for(int k=L[i];k<=R[i]&&k<=j;k++){
if(k!=L[i]) add(s[j][k],s[j][k-1]);
add(f[j][k],(ll)s[j][k]*FP[j-k]%mod);
}
for(int j=0;j<=i;++j){
memmove(g[j]+L[i],f[j]+L[i],sizeof(g[0][0])*(max(0,min(R[i],j)-L[i]+1)));
memset(s[j]+L[i],0,sizeof(g[0][0])*(max(0,min(R[i],j)-L[i]+1)));
memset(f[j]+L[i],0,sizeof(g[0][0])*(max(0,min(R[i],j)-L[i]+1)));
}
// for(int j=0;j<=i;j++)
// for(int k=L[i];k<=R[i]&&k<=j;k++)
// {g[j][k]=f[j][k],s[j][k]=f[j][k]=0;}
}
for(int j=0;j<=n;j++)
for(int k=L[n];k<=R[n]&&k<=j;k++)
if(g[j][k])
add(ans,(ll)g[j][k]*P[n-k]%mod*FP[n-j]%mod);
ans=(ans%mod+mod)%mod;
printf("%d\n",ans);
return 0;
}