PA 2021 Od deski do deski
题意
对于一个长度为
n 的序列A_1,A_2,\dots, A_n 每次你可以选择两个值相同但位置不同的元素A_i,A_j ,然后将A_i,A_{i+1},\dots, A_j 删除.如果一个序列可以通过上述操作删为空序列,那么就称这个序列是好的。
问有多少长度为
n 且元素在[1,m] 内的好的序列.1\le n\le 3000,1\le m\le 10^9.
题解
如果有包含关系的那么肯定删那个更大的,于是删除的区间不会有交。
考虑一个序列
考虑如何转移,如果当前合法,那么继续填那
总结一下四种转移:
思考一下发现
int main(){
cin>>n>>m;
f[0][0][1]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
if(f[i][j][1]){
f[i+1][j][1]=add(f[i+1][j][1],mul(f[i][j][1],j));
f[i+1][j+1][0]=add(f[i+1][j+1][0],mul(f[i][j][1],dec(m,j)));
}
if(f[i][j][0]){
f[i+1][j][1]=add(f[i+1][j][1],mul(f[i][j][0],j));
f[i+1][j][0]=add(f[i+1][j][0],mul(f[i][j][0],dec(m,j)));
}
}
}
for(int i=0;i<=n;i++)ans=add(ans,f[n][i][1]);
cout<<ans;
return 0;
}
2023/6/21 修改了错别字。