CF285G & AGC003D

给定 \(n, k\),问有多少个长度为 \(n\) 的排列 \(p\),满足恰好有 \(k\)\(i\) 使得 \(|p_i - i| = 1\)(称这个 \(i\) 为好的)。

\(k \le n \le 1000\)

\(g(k)\) 表示恰好\(k\) 个好的 \(i\) 的排列数。 这玩意是不好求的,但是如果要求 \(f(k)\) 表示选出 \(k\) 个好的位置,剩下的随意(即至少 \(k\) 个)的话就看起来可做一些。不难发现 \(f, g\) 之间的关系:

\[f(k) = \sum\limits_{i}^n \binom{i}{k} g(i) \]

根据二项式反演:

\[f(k) = \sum\limits_{i = k}^n \binom{i}{k} g(i) \iff g(k) = \sum\limits_{i = k}^n (-1)^{i - k} \binom{i}{k} f(i) \]

接下来就是求 \(f\) 了:AT_agc005D


子问题其实就是有若干条链,选 \(k\) 条边(不能有重复的点)的方案数,最后乘个 \((n - k)!\) 表示剩下的点的匹配方式。跑个 DP 即可。

运用二项式反演,将“恰好”转化为“至少”/“至多”,变成另一个问题进行计算。

posted @ 2025-11-08 22:29  xiehanrui0817  阅读(5)  评论(0)    收藏  举报