[AGC002 F]Leftmost Ball
题意
有\(1\cdots N\)的颜色球,每种有\(K\)个。将所有的\(N\times K\)球进行排列,同时将每种颜色的第一个凃成颜色\(0\)(没出现过),问有多少种可能的颜色序列。
- \(N,K\leq 2000\)
分析
先考虑一种最暴力的做法,就是我们考虑一个dp,设\(f_{i,2^S}\)表示前\(i\)个里面已经选了\(S\)这一个集合的球,那么就很容易进行进一步dp了。
但是,这个复杂度显然是炸上天了,我们肯定可以用某种方法进行改进。这里性能的瓶颈在于我们如何考虑已经选了的颜色。我们可以发现,这里所有的颜色本质上没有区别,也就是说,你完全可以把某两个颜色代表的意义换过来。
这样我们发现,我们完全可以利用一个序的关系。曾经就有一个题目,按照排序强行做操作从而很高效地解决了题目,这里也可以利用类似的思路。我们考虑,将颜色按照某种方式排序,然后我们可以设出\(f_{i,j}\)表示前\(i\)个数里面已经用了\(1\cdots j\)的颜色,我们考虑转移有两种,一种是前面\(j\)种颜色里面添加一种,一种是添加一种新的颜色。我们如果考虑强行让选的顺序是递增的,那么我们下一个选的颜色就只能是\(j\),也就是从\(f_{i-1,j-1}\)转移。由此很容易写出转移方程:\(f_{i,j}=j\times f_{i-1,j}+f_{i-1,j-1}\)。这个方程就很容易在\(\text O(NK)\)的时间内做完。实际上我们再看一眼:这不就是个斯特林数的递推式嘛!那我们只要套上斯特林数\(\text O(K\log N)\)就做完了……因为对于斯特林数我们存在一个公式:
\[S(n,m)=\frac{1}{m!}\sum\limits_{k=0}^m(-1)^{m-k}\binom{m}{k}k^n
\]
这个公式套进去就做完了……