【组合数学】排列组合与各种计数数列

版权声明:来自达羌蒟蒻 https://blog.csdn.net/PHenning/article/details/89286335
typedef int arr[maxn][maxn];

排列组合

排列与组合

n n 个不同的元素中,取 m m 个不重复的元素,按次序排列,称为从 n n 个中取 m m 个的排列
A n m = n ! ( n m ) ! A_n^m=\frac{n!}{(n-m)!}

n n 个不同的元素中,取 m m 个不重复的元素,不考虑次序,称为从 n n 个中取 m m 个的组合
C n m = n ! ( n m ) ! ( m ! ) C_n^m=\frac{n!}{(n-m)!(m!)}

组合数的性质:
C n m = C n n m i = 0 n C n i = 2 n C n m = C n 1 m + C n 1 m 1 \begin{aligned} C_n^m&=C_n^{n-m}\\ \sum_{i=0}^nC_n^i&=2^n\\ C_n^m&=C_{n-1}^m+C_{n-1}^{m-1} \end{aligned}

解读:

  • 性质1:从 n n 个数中选 m m 个数,等价于选出另外 n m n-m 个数,这样这 m m 个数随之确定。
  • 性质2:可以由二项式定理得到。
  • 性质3:运用递推思想,讨论是否选第 n n 个数,若选则在前 n 1 n-1 个数中选 m 1 m-1 个数,否则在前 n 1 n-1 个数中选 m m 个数。

根据 C n m = C n 1 m + C n 1 m 1 C_n^m=C_{n-1}^m+C_{n-1}^{m-1} 递推求组合数:

void make_C(arr C,int n){
  for(int i=0;i<=n;i++)C[i][0]=1;
  for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)
    C[i][j]=C[i-1][j]+C[i-1][j-1];
}

根据定义式推出 C n i = C n i 1 n i + 1 i C_n^i=C_n^{i-1}\frac{n-i+1}i 求出某一行组合数:

void make_Cn(int*C,int n){
  C[0]=1;
  for(int i=1;i<=n;i++)C[i]=C[i-1]*(n-i+1)/i;
}

二项式定理

( x + y ) n = k = 0 n C n k x n k y k (x+y)^n=\sum_{k=0}^nC_n^kx^{n-k}y^k

真のLucas定理

C n m m o d &ThinSpace;&ThinSpace; p C_n^m\mod p 的值( p p 为质数)。
C n m C n m o d &ThinSpace;&ThinSpace; p m m o d &ThinSpace;&ThinSpace; p C n p m p ( m o d p ) C_n^m\equiv C_{n\mod p}^{m\mod p}C_{\lfloor\frac np\rfloor}^{\lfloor\frac mp\rfloor}\pmod p

不想证明。
时间复杂度: O ( p log p m ) O(p\log_pm)

int C(int a,int b,int p){
  if(a<b)return 0;
  if(a==b)return 1;
  if(b>a-b)b=a-b;
  int A=1,B=1;
  for(int i=0;i<b;i++)A=A*(a-i)%p,B=B*(b-i)%p;
  return A*Pow(B,p-2,p)%p;
}
int Lucas(int n,int m,int p){
  return m?C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p:1;
}

扩展Lucas定理

C n m m o d &ThinSpace;&ThinSpace; p C_n^m\mod p 的值( p p 不一定为质数)。
首先将 p p 分解质因数: p = p 1 k 1 p 2 k 2 p 3 k 3 p q k q p=p_1^{k_1}p_2^{k_2}p_3^{k_3}\dots p_q^{k_q}
然后得出一个同余方程组,用中国剩余定理求解。
{ x C n m m o d &ThinSpace;&ThinSpace; p 1 k 1 ( m o d p 1 k 1 ) x C n m m o d &ThinSpace;&ThinSpace; p 2 k 2 ( m o d p 2 k 2 ) x C n m m o d &ThinSpace;&ThinSpace; p q k q ( m o d p q k q ) \begin{cases} x&amp;\equiv C_n^m\mod p_1^{k_1}\pmod{p_1^{k_1}}\\ x&amp;\equiv C_n^m\mod p_2^{k_2}\pmod{p_2^{k_2}}\\ &amp;\vdots\\ x&amp;\equiv C_n^m\mod p_q^{k_q}\pmod{p_q^{k_q}} \end{cases}

p q k q p_q^{k_q} 太大时,用Lucas算 C n m m o d &ThinSpace;&ThinSpace; p q k q C_n^m\mod p_q^{k_q} 会超时。怎么办?待补充。

Stirling数

第二类Stirling数表示把 n n 个元素划分成 m m 个非空集合的方案数。
S n m = S n 1 m 1 + m S n 1 m S_n^m=S_{n-1}^{m-1}+mS_{n-1}^m

**递推过程:**若前 n 1 n-1 个元素已经分成了 m 1 m-1 个集合,则第 n n 个元素自成一个集合,否则把第 n n 个元素放入 m m 个集合中的任意一个集合中。

void make_s2(arr s2,int n){
  for(int i=1;i<=n;i++)s2[i][1]=1;
  for(int i=1;i<=n;i++)for(int j=2;j<=i;j++)
    s2[i][j]=s2[i-1][j-1]+j*s2[i-1][j];
}

第一类Stirling数表示把 n n 个元素划分成 m m 个非空循环排列集合的方案数。
s n m = s n 1 m 1 + ( n 1 ) s n 1 m s_n^m=s_{n-1}^{m-1}+(n-1)s_{n-1}^m

**递推过程:**若前 n 1 n-1 个元素已经分成了 m 1 m-1 个集合,则第 n n 个元素自成一个集合,否则把第 n n 个元素放入前 n 1 n-1 个元素中任意一个元素的左边。

void make_s1(arr s1,int n){
  for(int i=1;i<=n;i++)s1[i][i]=1;
  for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)
    s1[i][j]=s1[i-1][j-1]+(i-1)*s1[i-1][j];
}

Bell数

Bell数表示把 n n 个元素划分成若干个非空集合的方案数。
B n = k = 1 n S n k B_n=\sum_{k=1}^nS_n^k

Catalan数

C n = { 1 n = 1 4 n 2 n + 1 C n 1 otherwise C_n=\begin{cases} 1&amp;n=1\\ \frac{4n-2}{n+1}C_{n-1}&amp;\text{otherwise} \end{cases}
C n = C 2 n n n + 1 = C 2 n n C 2 n n 1 C_n=\frac{C_{2n}^n}{n+1}=C_{2n}^n-C_{2n}^{n-1}

问题描述:

  • n n 对括号有多少种有效配对方式?
  • P = A 1 × A 2 × A 3 × . . . × A n P=A_1\times{A_2}\times{A_3}\times...\times{A_n} ,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
  • n n 个整数 1 , 2 , . . . , n 1,2,...,n 和一个栈,进栈顺序为 1 , 2 , . . . , n 1,2,...,n ,每个数字都要出入一次栈,用 S S 表示数字入栈, X X 表示数字出栈,那么合法的序列有多少个?
  • n n 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
    (由 n 2 \frac n2 0 0 n 2 \frac n2 1 1 组成的序列中数字 1 1 左侧 0 0 的个数要大于 1 1 的个数,问这样的序列由多少种?)
  • n n 个节点构成的二叉树,共有多少种不同情形?
  • 在圆上选择 2 n 2n 个点,将这些点成对连接起来使得所得到的 n n 条线段不相交的方法数?
  • 将一个凸多边形划分成三角形总共有多少种方法?
  • n n 个长方形填充一个高度为 n n 的阶梯状图形的方法个数?

这些问题的答案都是Catalan数或与Catalan有关。
答案是多少呢?我忘了。

猜你喜欢

转载自blog.csdn.net/PHenning/article/details/89286335
今日推荐