【做题记录】CF285E Positions in Permutations

  • \(\text{CF285E Positions in Permutations}\)

    • 算法:\(\text{dp}\)、组合数学、容斥

题目:

称一个 \(1\sim n\) 的排列的完美数为有多少个 \(i\) 满足 \(|P_i-i|=1\)

求有多少个长度为 \(n\) 的完美数恰好为 \(m\) 的排列。

\(n\le 1000,0\le m\le n\)

题解:

设完美数恰好为 \(m\) 的排列共有 \(f(m)\) 种。

再令 \(g(m)\) 表示强制性放 \(m\) 个满足条件的数,其余的随便放(也就是可能满足也可能不满足)的排列的个数。

所以显然有

\[g(m)=\sum _{i=m}^{n}\dbinom{i}{m}f(i) \]

又通过二项式反演得

\[f(m)=\sum_{i=m}^n (-1)^{i-m}\dbinom{i}{m}g(i) \]

那么对于 \(f\) 求出 \(g\) 即可。

然后我们设计一个感性的 \(\text{dp}\)

因为 \(g\) 只需要强制要求 \(m\) 位,所以我们只需要考虑那 \(m\) 位,其余的乘上 \((n-m)!\) 即可(随便放)

考虑这个 \(\text{dp}\)

\(dp_{i,j,0/1,0/1}\) 表示到了第 \(i\) 位而此时取了 \(j\) 个完美的位置,选还是不选第 \(i,i+1\) 位。

分类。


  1. 当前为完美位

那么就要有 \(|P_i-i|=1\),故 \(P_i\) 只能为 \(i-1\)\(i+1\)

  • 选择 \(i-1\)

那么此时必然要保证 \(i-1\) 位不选

\[\therefore dp_{i,j,1,0}+=dp_{i-1,j-1,0,1} \]

(选择 \(i\)

\[\therefore dp_{i,j,0,0}+=dp_{i-1,j-1,0,0} \]

(不选 \(i\)

  • 选择 \(i+1\)

同理保证 \(i+1\) 位不选。而此时 \(i-1\) 位可以随便选择,所以比起上面的多了一种可能(即选还是不选 \(i-1\) 位)

\[\therefore dp_{i,j,1,1}+=dp_{i-1,j-1,0,1}+dp_{i-1,j-1,1,1} \]

(选择 \(i\)

\[\therefore dp_{i,j,0,1}+=dp_{i-1,j-1,0,0}+dp_{i-1,j-1,1,0} \]

(不选择 \(i\)


  1. 当前不为完美位

那么就不能选择 \(i-1\)\(i+1\) 位了。

转移很显然了,注意将 \(j-1\) 改为 \(j\) (不选 \(i\) 所以还是只选了 \(j\) 个)

\[\therefore dp_{i,j,1,0}+=dp_{i-1,j,0,1}+dp_{i-1,j,1,1} \]

(选择 \(i\)

\[\therefore dp_{i,j,0,0}+=dp_{i-1,j,0,0}+dp_{i-1,j,1,0} \]

(不选 \(i\)


然后注意边界:

  1. \(i=1\)

\(dp_{1,0,0,0}=dp_{1,1,0,1}=1\)

  1. \(i=n\)

注意去掉 \(i+1\) 的可能。

\[\therefore g(m)=(dp_{n,m,1,0}+dp_{n,m,0,0})\times (n-m)! \]

然后再套回去求出 \(f(m)\) 即可。

时间复杂度 \(O(n^2)\)

posted @ 2022-01-07 19:36  trsins  阅读(30)  评论(0编辑  收藏  举报