组合数学|排列与组合

加法原理

完成一件事情,有N类方式去实现,第一类方式有 a 1 a_1 a1种,第二类方法有 a 2 a_2 a2种,…,第N类方法有 a n a_n an种,则完成这件事情的总方法数为:
∑ i = 1 N a i \sum_{i=1}^N a_i i=1Nai
例如:从北京到上海有火车、飞机、轮船 3 种方式,火车、飞机、轮船分别有 a1,a2,a3 个班次,那么从北京到上海有 a1+a2+a3 种方式可以到达。

乘法原理

做一件事,完成它要分成 n 个步骤,第一步有 a 1 a_1 a1 种不同的方法,第二步有 a 2 a_2 a2 种不同的方法,…,第 n 步有 a n a_n an 种不同的方法,那么完成这件事共有 a 1 × a 2 × a 3 × … × a n a_1 ×a_2×a_3×…×a_n a1×a2×a3××an 种不同的方法

例如:从北京乘坐火车到上海,需要转 3 次车,每次专车分别有 a1,a2,a3 个班次,那么从北京到上海有 a1×a2×a3 种方式可以到达。

排列组合

在排列与组合问题中,经常会出现计数问题,解决计数问题的思路一般有以下三种:

1)只取需要的。将各种符合条件的情形枚举出来,再利用加法原理求和。

2)先取后排。将各步符合条件的排列或组合计算出来,再根据乘法原理求积。

3)先全部取,再减去不要的。利用容斥定理,将各种符合条件的情形枚举出来,再减去不符合条件的。

排列数

n n n个不同元素中取出 m ( m < = n ) m(m<=n) m(m<=n)个元素的所有排列的个数,叫做从 n n n个不同元素中取出 m m m个元素的排列数,⽤符号 A n m A_n^m Anm表示
A n m = n ! ( n − m ) ! A_n^m=\frac{n!}{(n-m)!} Anm=(nm)!n!

组合数

n n n个不同元素中取出 m m m个元素的所有组合的个数,叫做从 n n n个不同元素中取出 m m m个元素的组合数。⽤符号 C n m C_n^m Cnm C ( n , m ) C(n,m) C(n,m)来表示
C n m = A n m m ! = n ! m ! ( n − m ) ! C_n^m=\frac{A_n^m}{m!}=\frac{n!}{m!(n-m)!} Cnm=m!Anm=m!(nm)!n!

组合恒等式

1) C n m = C n n − m C_n^m=C_n^{n-m} Cnm=Cnnm

2) C n m = C n − 1 m + C n − 1 m − 1 C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1} Cnm=Cn1m+Cn1m1

3) C n m = n m C n − 1 m − 1 C_n^m=\frac{n}{m}C_{n-1}^{m-1} Cnm=mnCn1m1

4) C n m + 1 = n − m m + 1 ∗ C n m C_n^{m+1}=\frac{n-m}{m+1}*C_n^m Cnm+1=m+1nmCnm

5) ( a + b ) n = ∑ k = 0 n C n k a n − k b k (a+b)^n=\sum_{k=0}^nC_n^ka^{n-k}b^{k} (a+b)n=k=0nCnkankbk(二项式定理)

特殊展开: 2 n = C n 0 + C n 1 + . . . + C n n − 1 + C n n 2^n=C_n^0+C_n^1+...+C_n^{n-1}+C_n^n 2n=Cn0+Cn1+...+Cnn1+Cnn

6) C n m C_n^m Cnm 为奇数时有 n&m=n

求组合数的方法

递推求组合数 O ( n m ) O(nm) O(nm)

// c[a][b] 表示从a个苹果中选b个的方案数
for (int i = 0; i < N; i ++ )
    for (int j = 0; j <= i; j ++ )
        if (!j) c[i][j] = 1;
        else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;

乘法逆元求组合数 O ( n ) O(n) O(n)

首先预处理出所有阶乘取模的余数fact[N],以及所有阶乘取模的逆元infact[N]
如果取模的数是质数,可以用费马小定理求逆元
int qmi(int a, int k, int p)    // 快速幂模板
{
    
    
    int res = 1;
    while (k)
    {
    
    
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}

// 预处理阶乘的余数和阶乘逆元的余数
fact[0] = infact[0] = 1;
for (int i = 1; i < N; i ++ )
{
    
    
    fact[i] = (LL)fact[i - 1] * i % mod;
    infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
}

杨辉三角形打表 O ( n m ) O(nm) O(nm)

1 1 1
11 11 11
121 1 21 121
1331 1 3 3 1 1331
14641 1 4 6 4 1 14641

我们不难发现其规律,每个数字等于其左上和上端的值,给定第 i i i行第 j j j列有,
a [ i ] [ j ] = a [ i − 1 ] [ j ] + a [ i − 1 ] [ j − 1 ] a[i][j] =a[i-1][j]+a[i-1][j-1] a[i][j]=a[i1][j]+a[i1][j1]
组合恒等式有: C n m = C n − 1 m + C n − 1 m − 1 C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1} Cnm=Cn1m+Cn1m1
那么,杨辉三角形第 i i i行第 j j j列可表示为: c i j c_ i^ j cij

 	f[0][0]=1;
    for(int i = 1; i < N; i++)
        for(int j = 1; j <= i + 1; j++)
            f[i][j] = f[i - 1][j] + f[i - 1][j - 1];

排列组合的应用

逐分法

需要分步骤完成的事件,我们首先想到的是乘法原理,对待事件逐一分配。

【例题】现在有12位警察,要分到3个路口每个路口4个人有多少种方案

【解析】第一个路口有 C 12 4 C_{12}^4 C124种选法,因为第一个路口已经用去了4位警察,所以第二个路口就只有 C 8 4 C_8^4 C84种了,第三个也只有 c 4 4 c_4^4 c44种了,根据乘法原理就可以得出总共的方案数就是 C 12 4 × C 8 4 × C 4 4 C_{12}^4×C_8^4×C_4^4 C124×C84×C44

捆绑法

要求元素相邻时,先整体考虑,将相邻元素视作一个大元素进行排序,然后再考虑大元素内部各元素间顺序。

【例题】由数字1、2、3、4、5、6、7组成无重复数字的七位数,求三个偶数必相邻的七位数的个数。

【解析】因为三个偶数2、4、6必须相邻,所以先将2、4、6三个数字“捆绑”在一起有 A 3 3 A_3^3 A33=6种不同的“捆绑”方法;再将捆绑后的元素与1、3、5、7进行全排列,有 A 5 5 A_5^5 A55=120种方法,根据乘法原理共有6×120=720种不同的排法,所以共有720个符合条件的七位数。

插空法

要求元素不相邻时,先将其他元素排好,再将所指定的不相邻的元素插入它们的间隙或两端位置,从而解决问题。

【例题】由数字1、2、3、4、5、6、7组成无重复数字的七位数,求三个偶数互不相邻的七位数的个数。

【解析】因为三个偶数2、4、6互不相邻,所以先将1、3、5、7四个数字排好,有 A 4 4 A_4^4 A44=24种不同的排法,再将2、4、6分别“插入”到第一步排的四个数字的五个“间隙”(包括两端的两个位置)中的三个位置上,有 A 5 3 A_5^3 A53=60种排法,根据乘法原理共有24×60=1440种不同的排法,所以共有1440个符合条件的七位数。

隔板法

n n n个相同的苹果分给 k k k个人,要求每个人至少分到一个,求方案数。

n n n个苹果排成一排,在其中插入 k − 1 k−1 k1块隔板,表示 k k k个人分到的部分。

插隔板的方法与分苹果的方案是一一对应的,那么方案数为 C n − 1 k − 1 C_{n−1}^{k−1} Cn1k1
那么如果有人可以分到 0 0 0个苹果呢?

我们给每个人多分一个苹果,使得每个人至少分配到一个苹果,在分配完之后再将每个人的苹果拿走一个。

那么方案数为 C k + n − 1 k − 1 C_{k+n−1}^{k-1} Ck+n1k1(先给k个苹果,让他们一人一个,再分n个苹果。)
隔板法与不定方程整数解的问题
求不定方程 x 1 + x 2 + x 3 + x 4 + . . . + x k = n x_1+x_2+x_3+x_4+...+x_k=n x1+x2+x3+x4+...+xk=n的解的个数,要求 x i > d i x_i>d_i xi>di
y i = x i − d i > 0 y_i=x_i-d_i>0 yi=xidi>0
那么有 y 1 + y 2 + y 3 + . . . + y k = n − ( d 1 + d 2 + d 3 + . . . + d k ) y_1+y_2+y_3+...+y_k=n-(d_1+d_2+d_3+...+d_k) y1+y2+y3+...+yk=n(d1+d2+d3+...+dk)
答案: C n − ( d 1 + d 2 + d 3 + . . . + d k ) − 1 k − 1 C_{n-(d_1+d_2+d_3+...+d_k)-1}^{k-1} Cn(d1+d2+d3+...+dk)1k1
在这里插入图片描述
(1) O − O − O − O − O − O − O − O − O − O O-O-O-O-O-O-O-O-O-O OOOOOOOOOO 9个空插3个隔板

答案为: C 9 3 C_9^3 C93

(2)非负整数意为 x i x_i xi可以是0,我们可以
( x 1 + 1 ) + ( x 2 + 1 ) + ( x 3 + 1 ) + ( x 4 + 1 ) = 14 (x_1+1)+(x_2+1)+(x_3+1)+(x_4+1)=14 (x1+1)+(x2+1)+(x3+1)+(x4+1)=14
即为: y 1 + y 2 + y 3 + y 4 = 14 y_1+y_2+y_3+y_4=14 y1+y2+y3+y4=14,13个空隙中插3个隔板
答案为: C 13 3 C_{13}^3 C133

(3)根据设 y i = x i − d i > 0 y_i=x_i-d_i>0 yi=xidi>0
( x 1 + 3 ) + ( x 2 + 2 ) + ( x 3 + 1 ) + ( x 4 − 1 ) = 15 (x_1+3)+(x_2+2)+(x_3+1)+(x_4-1)=15 (x1+3)+(x2+2)+(x3+1)+(x41)=15
即为: y 1 + y 2 + y 3 + y 4 = 15 y_1+y_2+y_3+y_4=15 y1+y2+y3+y4=15,14个空隙中插3个隔板
答案为: C 14 3 C_{14}^3 C143

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/113260480