Codeforces 1608F. MEX Counting (3200)
作者:互联网
题目描述
给定一个长度为 \(n\) 的序列 \(b\),需要计算满足下列条件的序列 \(a\) 的个数,答案对 \(998244353\) 取模。
- 序列 \(a\) 的长度为 \(n\);
- \(\forall i\in[1,n],0\le a_i\le n\);
- \(\forall i\in[1,n],|mex(a_1,a_2,\cdots,a_i)-b_i|\le k\)。
\(1\le n\le 2000,1\le k\le 50,b_i\in[-k,n+k]\)。
考虑 \(\text{dp}\)。
设 \(f_{i,j,k}\) 表示填完前 \(i\) 个数,\(\text{mex}\) 为 \(j\),有 \(k\) 种 \(>j\) 的值的方案数。
转移考虑两种情况。
- \(\text{mex}\) 不改变。此时 \(a_{i+1}\neq j\),那么考虑是否加入一个 \(>j\) 的新值。
- 加入新值。\(f_{i,j,k}\rightarrow f_{i+1,j,k+1}\)。
- 不加入新值。\((j+k)\cdot f_{i,j,k}\rightarrow f_{i+1,j,k}\)。
- \(\text{mex}\) 改变,此时 \(a_{i+1}=j\)。考虑枚举转移到的新 \(\text{mex}\) 为 \(x\)。则必定满足在原来 \(k\) 种 \(>j\) 的值中必定出现过 \(j+1\sim x-1\),那么这部分排列数即是 \(\frac{k!}{(k-(x-j-1))!}\)。所以 \(\forall x,|x-b_{i+1}|\le k,\frac{k!}{(k-(x-j-1))!}\cdot f_{i,j,k}\rightarrow f_{i+1,x,k-(x-j-1)}\)。
时间复杂度是 \(O(n^2k^2)\),考虑优化 \(\text{mex}\) 改变的地方。可以发现 \(f_{i+1,y,k-(x-j-1)}\) 往后转移时会乘 \((k-(x-j-1))!\),与当前转移过去抵消。
于是可以设 \(g_{i,j,k}=k!f_{i,j,k}\)。那么转移变成
- \((j+k)\cdot g_{i,j,k}\rightarrow g_{i+1,j,k}\)。
- \((k+1)\cdot g_{i,j,k}\rightarrow g_{i+1,j,k+1}\)。
- \(\forall x,|x-b_{i+1}|\le k,g_{i,j,k}\rightarrow g_{i+1,x,k-(x-j-1)}\)。
标签:le,3200,cdot,text,1608F,forall,Counting,mex,rightarrow 来源: https://www.cnblogs.com/Samsara-soul/p/Codeforces-1608F-solution.html