10.12 你猜是不是找规律

\(O(nk)\) 的暴力 DP 显然:设 \(f[i,j]\) 为前 \(i\) 个数交换不超过 \(j\) 次后合法的排列数,转移:\(f[i,j]=f[i-1,j]+(i-1)f[i-1,j-1]\)\(i\) 要么放在原位,要么与前 \(i-1\) 个数中的一个交换)

显然应该重设状态,发现每次交换最多使两个数合法,因此合法排列最多有 \(2k\) 个数非法,设 \(f[i,j]\) 表示 \(i\) 个数错排,交换恰好 \(j\) 次后合法的排列数(错排是为了把这 \(i\) 个数放回原序列后一定不合法,也就不会算重)
初值:\(f[0,0]=1\)
转移:\(f[i,j]=(i-1)(f[i-2,j-1]+f[i-1,j-1])\)
答案:\(\sum_{i=0}^{2k}{n\choose i}\sum_{j=1}^{k}f[i,j]\)

注意这题空间 \(128\) MB,要么开 int 要么滚动数组