求卡常
查看原帖
求卡常
723238
wukaichen888楼主2024/3/24 16:07
#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;
}
2024/3/24 16:07
加载中...