题解 [ABC156E] Roaming

\(n\) 不同个房间,每个房间有 \(1\) 个人。人可以在各个房间中移动(不能原地移动)。所有人一共移动了 \(k\) 次,问最后各个房间人数排列有多少种情况。

先模拟一下这个所谓的“移动”,容易发现,可以一个“经停”某个地方再到另一个。这样子是很难计算的,不妨规定必须一次性移动到一个位置。因为“经停”的存在,在新规则下移动不超过 \(k\) 次都可以。

所以考虑怎么计算这个方案数。
开始我想的是枚举一下不动的,然后剩下的里面进行插板,不能插出一个来。这样子肯定会有重复。所以想了很久如何避免重复,可以对插板做一个 dp,规定不能有隔一个插的,可是这样复杂度是 \(n^2\) 的,考虑容斥也仍然有很高的复杂度。想了很久也没有想到如何优化。
不禁让我萌生出“要是不能有的是 \(0\) 就好了,直接插板”的想法。

其实,为什么不考虑动的呢?
若移动以后该位又被填上了,那么可以看成这一位根本没有移动。所以必须要移动成 \(0\)。那么就简单了,枚举出来哪些是 \(0\),剩下的刚好符合我前面的愿望,直接插板即可。

答案就是 \(\sum {n \choose i} {n-1 \choose n-i-1}\)

有时候就是这样一念之间让一道本来觉得很不可做的题目变得很简单。

题解 [ABC156E] Roaming

上一篇:wait()、wait(long timeout)、sleep(long timeout)


下一篇:HBase-11-日志分割 (log splitting)