题目链接
官方题解:
学到了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const ll mod=998244355;
const int N=2e3+10;
ll dp[N][N];
int n,m,a[N];
void add(ll &x,ll y)
{
x=(x+y)%mod;
}
int main()
{
cin>>n>>m;
rep(i,1,n) scanf("%d",&a[i]);
if(a[1]==m-1||a[1]==m) dp[1][0]=1;
if(a[1]==m-1) dp[1][1]=1;
for(int i=2;i<=n;++i){
for(int j=0;j<=m;++j){
if(a[i]+j==m){
add(dp[i][j],dp[i-1][j]);
if(j) add(dp[i][j],dp[i-1][j-1]);
}
if(a[i]+j+1==m){
add(dp[i][j],dp[i-1][j+1]*(j+1)%mod);
add(dp[i][j],dp[i-1][j]*(j+1)%mod);
}
}
}
printf("%lld\n",dp[n][0]);
}