Description
原题传送门
定义一个排列P的第i个位置是好的,当且仅当|Pi−i|=1
|
P
i
−
i
|
=
1
给出n,m,要求长度为n的好的位置恰好有m个的排列数量。
1<=n<=1000,0<=m<=n 1 <= n <= 1000 , 0 <= m <= n
Solution
既然是恰好m个,我们第一反应肯定是容斥。
求出至少有多少个好的位置。
考虑DP,(不得不说这个状态设计真是精妙)
我们先假定不考虑它具体是怎么排列的,按位置填数。
第i个位置是好的,那就要么它放了i+1,要么它放了i-1
设F[i][j][0/1][0/1]
F
[
i
]
[
j
]
[
0
/
1
]
[
0
/
1
]
表示当前放到第i个位置,已经确定有j个位置是好的,数i是否已用,数i+1是否已用。
枚举下一个是否让他成为好的位置,分情况讨论即可。
注意如果不是好的位置,我们管它具体选什么,直接将他当做任意的数来转移即可。
最后令G[i] G [ i ] 表示至少有i个位置的答案,它明显等于f[n][i][0][0]+f[n][i][1][0] f [ n ] [ i ] [ 0 ] [ 0 ] + f [ n ] [ i ] [ 1 ] [ 0 ] (不存在n+1这个数)
总的答案就是∑j=mnG[j]∗(n−j)!∗(−1)j−m ∑ j = m n G [ j ] ∗ ( n − j ) ! ∗ ( − 1 ) j − m
Code