【做题记录】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\) 个满足条件的数,其余的随便放(也就是可能满足也可能不满足)的排列的个数。
所以显然有
又通过二项式反演得
那么对于 \(f\) 求出 \(g\) 即可。
然后我们设计一个感性的 \(\text{dp}\):
因为 \(g\) 只需要强制要求 \(m\) 位,所以我们只需要考虑那 \(m\) 位,其余的乘上 \((n-m)!\) 即可(随便放)
考虑这个 \(\text{dp}\)。
设 \(dp_{i,j,0/1,0/1}\) 表示到了第 \(i\) 位而此时取了 \(j\) 个完美的位置,选还是不选第 \(i,i+1\) 位。
分类。
- 当前为完美位
那么就要有 \(|P_i-i|=1\),故 \(P_i\) 只能为 \(i-1\) 或 \(i+1\)
- 选择 \(i-1\)
那么此时必然要保证 \(i-1\) 位不选
(选择 \(i\))
(不选 \(i\))
- 选择 \(i+1\)
同理保证 \(i+1\) 位不选。而此时 \(i-1\) 位可以随便选择,所以比起上面的多了一种可能(即选还是不选 \(i-1\) 位)
(选择 \(i\))
(不选择 \(i\))
- 当前不为完美位
那么就不能选择 \(i-1\) 和 \(i+1\) 位了。
转移很显然了,注意将 \(j-1\) 改为 \(j\) (不选 \(i\) 所以还是只选了 \(j\) 个)
(选择 \(i\))
(不选 \(i\))
然后注意边界:
- \(i=1\)
\(dp_{1,0,0,0}=dp_{1,1,0,1}=1\)
- \(i=n\)
注意去掉 \(i+1\) 的可能。
然后再套回去求出 \(f(m)\) 即可。
时间复杂度 \(O(n^2)\)。