错排、卡特兰数、斯特林数小结
一. 错排
1.计算公式:
1) D[n] = (n-1)*(D[n-1]+D[n-2]) ,n>=2, D[0] = 1, D[1] = 0 。
解释:对于第n个要加入错排的数,它可以和已经错排的n-1个数的其中一个进行交换,构成错排,于是又 (n-1)*D[n-1];此外,第n个数还可以与n-1个数中唯一一个没有加入错排的数(n-2个构成错排,剩下一个待定)进行交换,这样就构成了n错排,而这n-1个数之中,每个数都可以作为那个唯一一个没有加入错排的数,故(n-1)*D[n-2]。所以 D[n] = (n-1)*(D[n-1]+D[n-2])。
2) A[n] - sigma(C[n][k]*A[n-k]), 1<=k<=n,容斥原理。
2.题目:
HDU1465 不容易系列之(全错排)
HDU2049 不容易系列之(4)考新郎(部分错排)
Codeforces Round #198 (Div. 2) E. Iahub and Permutations(限定条件下的错排)
二.卡特兰数
1.卡特兰数计算公式:
1) h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (n>=1) , 其中 h[0] = 1;
2) h(n) = c(2n,n) - c(2n,n+1)(n=0,1,2,...) <==> h(n) = C(2n,n)/(n+1)
3) h(n) = h(n-1)*(4*n-2) / (i+1) ……此条计算公式容易溢出
3.注意:卡特兰数的计算很容易溢出。
2.题目:
三.第一类斯特林数
1. 定义:n个人(有区别)围成m个圈(无区别)的方案数。
2. 计算公式:S[n][m] = S[n-1][m-1] + (n-1)*S[n-1][m]
解释:第n个人要加入进去,那么他有两种选择:一是自己作为一圈,那么有S[n-1][m-1]种情况;二是加入已存在的圈子中,那么他有n-1种站位方式(可以想象成站在某个人的左边),所以有 (n-1)*S[n-1][m]种情况。所以总的方案数为:S[n][m] = S[n-1][m-1] + (n-1)*S[n-1][m] 。
3. 题目:
四.第二类斯特林数
1.定义:将n个不同的球放入m个无差别的盒子中,要求盒子非空,有几种方案?
2.计算公式:S(n+1, m) = S(n, m-1) + m*S(n, m)
解释:假设要把n个元素分成m个集合。如果n-1个元素构成了m-1个集合,那么第n个元素单独构成一个集合。方案数为 S ( n-1, m-1 )。如果n个元素已经构成了m个集合,将第n+1个元素插入到任意一个集合。方案数 m * S ( n-1, m ) 。综合两种情况得: S ( n+1, m ) = S ( n, m-1 ) + m * S ( n, m ) 。
3.几种变形: