错排、卡特兰数、斯特林数小结

一. 错排

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)考新郎(部分错排)

HDU2068 RPG的错排

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.题目:

HDU2067 小兔的棋盘

HDU1133 Buy the Ticket 

HDU3723 Delta Wave

三.第一类斯特林数

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. 题目:

HDU4372 Count the Buildings

四.第二类斯特林数

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.几种变形:

第二类Stirling数主要是用于解决组合数学中的几类放球模型。主要是针对于球之前有区别的放球模型:
(1)n个不同的球,放入m个无区别的盒子,不允许盒子为空。
方案数: 
 S ( n, m )
。这个跟第二类Stirling数的定义一致。
(2)n个不同的球,放入m个有区别的盒子,不允许盒子为空。
方案数: 
 m! * S ( n, m )
。因盒子有区别,乘上盒子的排列即可。
(3)n个不同的球,放入m个无区别的盒子,允许盒子为空。
方案数: sigma ( S ( n, k ) ), 0<=k<=m。枚举非空盒的数目便可。
(4)n个不同的球,放入m个有区别的盒子,允许盒子为空。
①方案数: sigma ( P( m, k ) * S( n, k )  ), 0<=k<=m。同样可以枚举非空盒的数目,注意到盒子有区别,乘上一个排列系数。
②既然允许盒子为空,且盒子间有区别,那么对于每个球有m中选择,每个球相互独立。有方案数: 
m^n
 
 
4.题目:
原文地址:https://www.cnblogs.com/DOLFAMINGO/p/8336472.html