给定 \(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 即可。
运用二项式反演,将“恰好”转化为“至少”/“至多”,变成另一个问题进行计算。