ARC114 - Sequence Scores
题目大意:对于一个序列(A=a_i,a_iin[1,m]),定义(f(A))为
对于一个全零的初始序列,每次选择一个区间对于某一个值取(max),最少生成(A)的步数
求所有(m^n)种(A)的(f(A))之和
首先考虑(f(A))的计算,显然可以采用如下方法
b[i]=0
Function Solve(l,r)
v=min a[l..r]
for i in l,r
b[i]=max{b[i],v}
Divide a[l..r] into contiguous ranges that a[i]!=b[i] , Solve(l',r')
那么考虑计算一个区间([l,r])被( ext{Solve})的次数
显然区间([l,r])被( ext{Solve})当且仅当
(min{a_i|iin[l,r]}>max(a_{l-1},a_{r+1}))
对于不同的(r-l+1),枚举(min),计算方案数即可
注意考虑(l=1or r=n)的边界情况
const int N=5010,P=998244353;
int n,m;
int Pow[N][N],F[N][3];
int main(){
n=rd(),m=rd();
rep(i,0,N-1) rep(j,*Pow[i]=1,N-1) Pow[i][j]=1ll*Pow[i][j-1]*i%P;
rep(i,1,n) rep(j,0,2) rep(k,1,m) {
F[i][j]=(F[i][j]+1ll*(Pow[m-k+1][i]-Pow[m-k][i]+P)*Pow[k-1][j])%P;
}
int ans=0;
rep(i,1,n) rep(j,i,n) {
int c=(i>1)+(j<n);
ans=(ans+1ll*F[j-i+1][c]*Pow[m][n-(j-i+1)-c])%P;
}
printf("%d
",ans);
}