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)}\)。
上一篇:[论文阅读] Annotation-Efficient Cell Counting


下一篇:202. 水洼计数 Lake Counting(挑战程序设计竞赛)