题目描述
称一个 1 ∼ n 1\sim n 1∼n 的排列的完美数为有多少个 i i i 满足 ∣ P i − i ∣ = 1 |P_i-i|=1 ∣Pi−i∣=1
求有多少个长度为n 的完美数恰好为 m 的排列。
Sol
设 f ( k ) f(k) f(k) 表示长度为 n n n 的排列恰好有 k k k 个完美数的方案数
但是发现不好算 , 我们先往容斥上想
设 F ( k ) F(k) F(k) 表示至少有 k k k 个的方案
先考虑一个dp , 我们考虑当前位置上的数是不是要是幸运数
设 f [ i ] [ j ] [ 0 / 1 ] [ 0 / 1 ] f[i][j][0/1][0/1] f[i][j][0/1][0/1]表示考虑到了第 i i i 位 , 至少已经有了 j j j 个幸运数 , i i i 和 i + 1 i+1 i+1 是否已经被用于充当幸运数 , 其他的位置不予考虑的方案数
为什么要这样设? 因为我们只考虑当前为就很好统计个数 , 然后当前位要成为幸运数就只能是 i + 1 i+1 i+1 和 i − 1 i-1 i−1 , 所以记录一下有没有用过
我们先自己 YY 一个转移(我这里卡常,数组换了维):
转移代码:
for(register int i=2;i<=n;++i){
for(register int j=0;j<i;++j){
upd(dp[0][0][i][j],dp[0][0][i-1][j]);
upd(dp[0][0][i][j],dp[1][0][i-1][j]);
upd(dp[1][0][i][j],dp[0][1][i-1][j]);
upd(dp[1][0]