简单组合数学
概念讲解
排列数
从 n 个不同元素中取 m 个进行排列:
组合数
从 n 个不同元素中取 m 个进行组合:
杨辉三角
性质
实现
1234567891011const int N = 1005;
long long C[N][N];
void init() {
for (int i = 0; i < N; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
}组合数取模
123456789101112const int MOD = 1e9 + 7;
const int N = 1005;
long long C[N][N];
void init() {
for (int i = 0; i < N; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
}
}
}考点分析
初赛考查方式
- 选择题: 组合数计算
- 程序阅读: 杨辉三角
- 编程题: 计数问题
常见考点
- 排列组合公式
- 杨辉三角性质
- 组合数取模
例题精讲
例题 1:组合数
题目: 是多少?
解答:
例题 2:杨辉三角
题目: 杨辉三角第 5 行是什么?
解答:
1 4 6 4 1练习题
- 和 的关系是什么?
查看答案
相等,即
证明:
例如:
- 杨辉三角的递推公式是什么?
查看答案
含义:从 n 个元素中选 m 个 = 包含某个特定元素的方案 + 不包含该元素的方案
- 组合数取模的方法是什么?
查看答案
使用杨辉三角递推:
1234567891011const int MOD = 1e9 + 7;
long long C[N][N];
void init() {
for (int i = 0; i < N; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
}
}
}注意:在计算过程中取模,防止溢出。
易错点
⚠️ 注意:
- 排列有序,组合无序
- 杨辉三角可以用递推预处理
- 取模要在计算过程中进行