一、加法原理和乘法原理
1、定义:
①加法原理:
加法原理是分类计数原理,常用于排列组合中,具体是指:做一件事情,完成它有N类方式,第一类方式有M1种方法,第二类方式有M2种方法,……,第n类方式有Mn种方法,那么完成这件事情共有M1+M2+……+Mn种方法。
口诀:类类独立
②乘法原理:
做一件事,完成它需要分成N个步骤,做第一步有M1种不同的方法,做第二步有M2种不同的方法,……,做第n步有Mn种不同的方法。那么完成这件事共有 N=M1×M2×M3×…×Mn 种不同的方法。
口诀:步步相关
2、例:
(1)某中学八年级一班有12名男生,16名女生;二班有9名男生,17名女生。
问:
从这两个班的同学中,选择 1 名男生、1 名女生作为主持人。有几种选法?
利用乘法原理,总方案数等于 总男生数 * 总女生数
(12+9)∗(16+17)=693
3、模运算
在得数较大时,要每进行一步计算就取余。
模运算符合以下规律
(1)(a−b)%p=(a%p−b%p)%p
(2)(a+b)%p=(a%p+b%p)%p
(3)(a∗b)%p=(a%p∗b%p)%p
(4)(ab)%p=((a%p)b)%p
二、排列与组合
1、排列数
定义:从 n 个人里面选出 m 个人站成一排,方案数是: n ⋅ (n − 1) ⋯ (n − m + 1) = n!(n−m)!。我们将它称为排列数。
排列数用 Amn 表示“从 n 个元素里面取 m 个元素,排成一排的方案数”,也就是Amn = n!(n−m)!。
2、组合数
(1) 定义:
用 Cmn 表示“从 n 个元素里面选出 m 个元素”的方案数,我们将它称为组合数。
(2) 公式:
组合数的递推公式,称为帕斯卡公式。
Cmn = Cm−1n−1 + Cm−1n
Cn0=1 ; Cnn=1 ; C00=1
组合数的通项公式
Cmn = AmnAmm = n⋅(n−1)⋅⋅⋅(n−m+1)m(m−1)⋅⋅⋅2⋅1 = n!m!⋅(n−m)!
互补性质
Cmn=Cn−mn
(3) 代码实现
①通项公式
long long fac(int n) { long long f=1; for(int i=n;i>0;i--) f *= i; return f; }//求阶乘 long long C(int n, int m) { return fac(n)/(fac(n - m)*fac(m)); }
②递归公式
for (int i=0;i<=21;i++) { C[i][0] = C[i][i] = 1; for (int j=1;j<i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1] ; //递推 }
文章转载于本人原博客
- 0
- 0
- 0
- 0
Preview: