笔记——排列组合
蓝月の笔记——排列组合篇
摘要
万恶的数学!
Part 1 加乘原理
小学奥数内容
加法原理:当多个方案并列(即互不影响)时,总方案数为各个方案数之和
例:共有
乘法原理:当多个方案分步完成时,总方案数为各步方案数之积
例:从
Part 2 排列组合数
排列数
从
公式推导
选第
根据乘法原理,
组合数
从
公式推导
选出
对称性
在
多重组合数
实际上是全排列,有
公式推导
假设多胞胎交换位置算作多种方案,答案显然为
每一对多胞胎之间都有
Part 3 插板法
可以理解为求不定方程
在
答案为
在
答案为
令
在
答案为
Part 4 杨辉三角&二项式定理
杨辉三角:
通过瞪眼法可以知道,杨辉三角的第
再次通过瞪眼法可以知道,杨辉三角最左一列和最右一列都是
再再次通过瞪眼法,可以发现杨辉三角的第
将二项式推广为多项式,同理可得
我们称
Part 5 圆排&项链排&错排
圆排列
显然为全排列除以旋转次数,
项链排列
在圆排列的基础上除以两种翻转方式,
错位排列(信封问题)
例题终于有题了
令
错排数可以使用递推求解,Oi Wiki上已经讲的很清楚了,我就(懒)不(得)讲了
Code:
d[0] = 1, d[1] = 0, d[2] = 1;
for (int i = 3; i < kMaxN; i++) {
d[i] = ((i - 1) * ((d[i - 1] + d[i - 2]) % kP)) % kP;
}
Part 6 抽屉原理
小学奥数内容
有
推广后同理可得,有
Part 7 容斥原理
怎么tm还是小学奥数内容
有
用集合形式表示即为
推广到一般形式:
先使用背包求出无限制的情况下所有价格的方案数,再求出用每一种硬币付不起的最小价格,最后按公式容斥即可(位运算是个好东西,可惜我不会)
// BLuemoon_
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int kMaxN = 1e5 + 5, kN = 4 + 5;
LL n, t, c[kN], a[kN], s, dp[kMaxN], f[kN], ans;
int main() {
cin >> c[1] >> c[2] >> c[3] >> c[4], dp[0] = 1;
for (int i = 1; i <= 4; i++) {
for (int j = c[i]; j <= 1e5; j++) {
dp[j] += dp[j - c[i]];
}
}
for (cin >> t; t; t--, ans = f[5] = 0) {
cin >> a[1] >> a[2] >> a[3] >> a[4] >> s, ans += dp[s];
for (int i = 1; i <= 4; i++) {
f[i] = c[i] * (a[i] + 1), (s >= f[i]) && (ans -= dp[s - f[i]]), f[5] += f[i];
}
for (int i = 1; i <= 3; i++) {
for (int j = i + 1; j <= 4; j++) {
(s >= (f[i] + f[j])) && (ans += dp[s - f[i] - f[j]]);
}
}
for (int i = 1; i <= 2; i++) {
for (int j = i + 1; j <= 3; j++) {
for (int l = j + 1; l <= 4; l++) {
(s >= (f[i] + f[j] + f[l])) && (ans -= dp[s - f[i] - f[j] - f[l]]);
}
}
}
(s >= f[5]) && (ans += dp[s - f[5]]);
cout << ans << '\n';
}
return 0;
}
Part 8 卡特兰数
我们来看一些问题:
1.
在坐标系中从
2.
圆上有
3.
这些问题的答案都是卡特兰数,写作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】