[CSP-S 2025] 员工招聘
切掉了 /cy
题目链接: [CSP-S 2025] 员工招聘 。
题目描述:
有 n 个数,第 i 个数为 ci 。还有一个长度为 n 的 01 串 s 。
一个长度为 n 的排列 p 合法当且仅当:
- 依次考虑 i=1,2,⋯,n 并初始化计数器 C=0。
- 若 cpi≤C 或 si=0 ,则 C+1→C 。
- 若最终 C≤n−m ,则排列 p 合法。
求有多少种合法的排列 p ,对 998244353 取模。
n≤500 。
定义 fi,j,k 为考虑 s 的前 i 个字符,有 j 个数使得 C+1→C ,有 k 个数满足他们的 c 比 j 大且不考虑这些数具体是什么的合法排列数。
设 cntj 表示 ci=j 的 i 的个数, sumj 为 cntj 的前缀和。
不妨分类讨论一下。
Case #1: si=0
这种情况下必然有 C+1→C 。即 j 必定会增大 1 。
由于 j 变为 j+1 ,所以 k 的含义变为了 c 大于 j+1 的数,所以要把恰好等于 j+1 的数的排列贡献加入。
设有 l 个数字满足他们的 c 恰好为 j+1 ,则共有 (lcntj+1)(lk)l! 种方案。其中 (lcntj+1) 的含义是从恰好满足 c 为 j+1 的数中选择 l 个; (lk)l! 表示从原来没有确定具体内容的 k 个位置(因为其他 i−k 个位置已经确定了)选择有顺序的 l 个。
则我们可以分类讨论:
Case #1.1
若 i+1 的数 p 满足 cp≤j+1 ,则有:
(sumj+1−(i−(k−l)))(lcntj+1)(lk)l!fi,j,k→fi+1,j+1,k−l
Case #1.2
若 i+1 的数不满足 Case #1.1 ,则:
(lcntj+1)(lk)l!fi,j,k→fi+1,j+1,k−l+1
Case #2: si=1
同样的,分类讨论。
Case #2.1
若 i+1 的数 p 满足 cp≤j ,则有:
(sumj−(i−k))(lcntj+1)(lk)l!fi,j,k→fi+1,j+1,k−l
Case #2.2
若 i+1 的数不满足 Case #2.2 ,则有:
fi,j,k→fi+1,j,k+1
然后就没了,模拟就行。