[ARC114 C] - Sequence Scores
一道狗屎的题目
问题陈述
对于长度为 NNN 的序列 AAA ,由 111 和 MMM (包括)之间的整数组成,让我们定义 f(A)f(A)f(A) 如下:
-
我们有一个长度为 NNN 的序列 XXX ,其中每个元素最初都是 000 。 f(A)f(A)f(A) 是通过重复以下操作使 XXX 等于 AAA 所需的最小操作次数:
-
指定 1≤l≤r≤N1 \leq l \leq r \le N1≤l≤r≤N 和 1≤v≤M1 \le v \le M1≤v≤M ,然后为每个 l≤i≤rl \leq i \le rl≤i≤r 替换 XiX_iXi 为 max(Xi,v)\max(X_i, v)max(Xi,v) 。
求 f(A)f(A)f(A) 对所有 MNM^NMN 序列 AAA 取模 998244353998244353998244353 的和。
思路:
首先,我们先举两个例子:
若此时N=5N=5N=5,序列AAA为1,2,2,2,11,2,2,2,11,2,2,2,1,f(A)=?f(A)=?f(A)=?
若此时N=5N=5N=5,序列AAA为2,1,1,1,22,1,1,1,22,1,1,1,2,f(A)=?f(A)=?f(A)=?
第一个例子,明显可以看出,可以现将所有数变为111,在将A[2−3]A[2-3]A[2−3](序列A下表为1≤i≤N序列A下表为1 \le i \le N序列A下表为1≤i≤N)变为二。所以f(A)=2f(A)=2f(A)=2
可是第二个例子就不一样了,此时,我们有两种选择。
1、先将A[N],A[1]A[N],A[1]A[N],A[1]变为222,再将A[2−3]A[2-3]A[2−3]变为111。2、先将A[1−N]A[1-N]A[1−N]变为111,再将A[2],A[3]A[2],A[3]A[2],A[3]变为222。
无论哪种选择,答案都为f(A)=3f(A)=3f(A)=3。
由此:
1、当Ai=Aj(j≤i)A_i = A_j(j \le i)Ai=Aj(j≤i)且有Ak<Ai=Aj(j≤k≤i)A_k < A_i = A_j(j \le k \le i)Ak<Ai=Aj(j≤k≤i)时,f(A)+1f(A)+1f(A)+1
2、当Ai=Aj(j≤i)A_i = A_j(j \le i)Ai=Aj(j≤i)且有Ak>Ai=Aj(j≤k≤i)A_k > A_i = A_j(j \le k \le i)Ak>Ai=Aj(j≤k≤i)时,f(A)f(A)f(A)不变。
所以,现设fi,xf_{i,x}fi,x为在AiA_iAi处填上x,A[1−i]x,A[1-i]x,A[1−i]段产生的贡献值。
fi,x=Mi−1−∑k=1i−1(M−x)i−k−1Mk−1f_{i,x}=M^{i-1}-\sum_{k=1}^{i-1}(M-x)^{i-k-1}M^{k-1}fi,x=Mi−1−∑k=1i−1(M−x)i−k−1Mk−1
其中,Mi−1M^{i-1}Mi−1为在确定了AiA_iAi后的可能总数
∑k=1i−1(M−x)i−k−1Mk−1\sum_{k=1}^{i-1}(M-x)^{i-k-1}M^{k-1}∑k=1i−1(M−x)i−k−1Mk−1表示在Ak>Ai=Aj(j≤k≤i)A_k > A_i = A_j(j \le k \le i)Ak>Ai=Aj(j≤k≤i)时,不会让f(A)f(A)f(A)改变的可能。Mk−1M^{k-1}Mk−1即在1≤i<k1 \le i < k1≤i<k时,前面的数随意填。
我们接下来设元化简,以下化简过程,请自行理解(理解不了就别理解!):
设Gi,x=∑k=1i−1(M−x)i−k−1Mk−1G_{i,x}=\sum_{k=1}^{i-1}(M-x)^{i-k-1}M^{k-1}Gi,x=∑k=1i−1(M−x)i−k−1Mk−1
因为Gi,x=∑k=1i−1(M−x)i−k−1Mk−1G_{i,x}=\sum_{k=1}^{i-1}(M-x)^{i-k-1}M^{k-1}Gi,x=∑k=1i−1(M−x)i−k−1Mk−1
Gi−1,x=∑k=1i−2(M−x)i−k−1Mk−1G_{i-1,x}=\sum_{k=1}^{i-2}(M-x)^{i-k-1}M^{k-1}Gi−1,x=∑k=1i−2(M−x)i−k−1Mk−1
所以:Gi,x−Gi−1,x=Gi−1,x∗M+(M−x)i−2G_{i,x}-G_{i-1,x}=G_{i-1,x}*M+(M-x)^{i-2}Gi,x−Gi−1,x=Gi−1,x∗M+(M−x)i−2
类似小学数学奥数中的错位相减法。
设ans(n)ans(n)ans(n)为最后答案。
则:ans(i)=ans(i−1)+∑j=1mfi,jans(i)=ans(i-1)+\sum_{j=1}^{m}f_{i,j}ans(i)=ans(i−1)+∑j=1mfi,j
所以最后为:
ans(i)=ans(i−1)+∑j=1mMi−1−Gi,jans(i)=ans(i-1)+\sum_{j=1}^{m}M^{i-1}-G_{i,j}ans(i)=ans(i−1)+∑j=1mMi−1−Gi,j
完结撒花 (作者已经接近窒息)
Sol:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,mod=998244353;
ll poww[5009][5009],ans[5009],dp[5009][5009];
int main()
{cin>>n>>m;for(ll i=0;i<=m;i++){poww[i][0]=1;for(ll j=1;j<=n;j++){poww[i][j]=poww[i][j-1]*i%mod;}}for(ll i=2;i<=n;i++){for(ll j=1;j<=m;j++){dp[i][j]=(dp[i-1][j]*m%mod+poww[m-j][i-2])%mod;}}for(ll i=1;i<=n;i++){for(ll j=1;j<=m;j++){ans[i]=(ans[i]+ans[i-1]+poww[m][i-1]-dp[i][j]+mod)%mod;}}cout<<ans[n];return 0;
}