SDOI 2016 排列计数
设满足题目条件且长度为n恰好有m个数稳定的序列数为 a n s ( n , m ) ans(n,m) ans(n,m)
那么易得题目答案ANS可表示为:
A N S = a n s ( n , m ) = C ( n , m ) ∗ a n s ( n − m , 0 ) ANS=ans(n,m)=C(n,m)*ans(n-m,0) ANS=ans(n,m)=C(n,m)∗ans(n−m,0)
因为题目规定 n , m ≤ 1 e 6 n,m\le1e6 n,m≤1e6,所以C(n,m)可以通过预处理阶乘+乘法逆元快速求得。
至于ans(n-m,0),又被称作为全错位排位数。
即n个相异的元素排成一排且 a i ≠ i a_i\ne i ai=i的排列个数。
设长度为n的全错位排列数为Fn,有如下递推公式:
F n = ( n − 1 ) ( F n − 1 + F n − 2 ) , n ≥ 3 F_n=(n-1)(F_{n-1}+F_{n-2}),n\ge3 Fn=(n−1)(Fn−1+Fn−2),n≥3,其中 F 1 = 0 , F 2 = 1 F_1=0,F_2=1 F1=0,F2=1。另外对于长度为0的序列,规定其全错位排列数为1。
证明:依据递推的思想,显然 F 1 = 0 , F 2 = 1 F_1=0,F_2=1 F1=0,F2=1,对于 n ≥ 3 n\ge3 n≥3,不妨设第n个数排在了第 k ( k ≠ n ) k(k\ne n) k(k=n)位。
1、若第k个数排在了第n位,那么对于n和k两个位置满足 a n ≠ n , a k = n ≠ k a_n\ne n,a_k=n\ne k an=n,ak=n=k,那么只剩下了n-2个数,显然剩下n-2个数可构成的全错位排列数为 F n − 2 F_{n-2} Fn−2
2、若第k个数没有排在第n位,则规定了 a n ≠ k a_n\ne k an=k,那么可以将第n位假想为第k位,那么问题就转换成了n-1个数的全错位排列问题,解为 F n − 1 F_{n-1} Fn−1。
由于 1 ≤ k < n 1\le k< n 1≤k<n,所以 F n = ( n − 1 ) ( F n − 1 + F n − 2 ) F_n=(n-1)(F_{n-1}+F_{n-2}) Fn=