ARC169C Not So Consecutive
读错题了,写了一车组合数还在想为什么过不去最后一个样例。
更好的阅读体验 qwq
Description
给一个长度为
你要给所有
- 对于任意
[1,n] 之间的整数i ,不能在A 中连续出现超过i 次。
求方案数,答案对
Solution
设
这样直接做是
首先方括号里那一串式子本质上是找
对每个数维护
这个过程对每个
再把
设
#define int long long
const int N=5005,mod=998244353;
int pos[N],f[N][N],s[N][N],sum[N],n,a[N];
signed main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read();
f[0][0]=1,sum[0]=1;
for(int i=1;i<=n;i++)
{
if(a[i]!=-1) pos[a[i]]=i;
int mx1=0,mx2=0;
for(int j=1;j<=n;j++)
{
if(pos[j]>mx1) mx2=mx1,mx1=pos[j];
else if(pos[j]>mx2) mx2=pos[j];
}
for(int j=1;j<=n;j++)
{
int lst=max(i-j,(a[mx1]==j)?mx2:mx1);
f[i][j]=sum[i-1]-(lst?sum[lst-1]:0)-(s[i-1][j]-(lst?s[lst-1][j]:0));
f[i][j]=(f[i][j]%mod+mod)%mod;
s[i][j]=(s[i-1][j]+f[i][j])%mod;
(sum[i]+=f[i][j])%=mod;
}
(sum[i]+=sum[i-1])%=mod;
}
cout<<(sum[n]-sum[n-1]+mod)%mod<<endl;
return 0;
}