CSP 初赛数学复习
17 October 2019 |
duanyll | Tags:
数学
数学逻辑记号
与 | 或 | 非 |
---|---|---|
$\land$ | $\lor$ | $\lnot$ |
C++ 运算符优先级:
排列组合
排列的定义: 从$n$个不同元素中, 任取$m$个元素, 按照一定的顺序排成一列, 叫做从$n$个不同元素中取出$m$个元素的一个排列.
\[P_n^m=\frac{n!}{(n-m)!}\]组合的定义: 从n个不同元素中, 任取m个元素, 并成一组, 叫做从n个不同元素中取出m个元素的一个组合.
\[C_n^m=\frac{n!}{m!(n-m)!}\]与顺序有关的用排列, 与顺序无关的用组合
加法原理, 乘法原理.
一些重要思想
学校师生合影,共8个学生,4个老师,要求老师在学生中间,且老师互不相邻,共有多少种不同的合影方式?
插入法: 对于要求某几个元素不相邻的问题, 可以考虑先排好其他的元素, 而对于不相邻的元素从其他元素排好后的的序列中枚举空位插入. 答案: $P_8^8 * P_7^4$
5个男生3个女生排成一排,3个女生要排在一起,有多少种不同的排法?
捆绑法: 要求相邻的元素可以视作一个元素参加排列, 注意捆绑的元素内部也能产生排列. 答案: $P_6^6 * P_3^3$
袋中有不同年份生产的5分硬币23个, 不同年份生产的1角硬币10个, 如果从袋中取出2元钱, 有多少种取法?
剩余法: 硬币共有2.15元, 取出两元即留下0.15元, 可以是$0.05 * 3$或$0.1 + 0.05$, 分别运用加法原理乘法原理得答案: $C_{23}^{3}+C_{23}^1*C_{10}^1$
学校安排考试科目9门, 语文要在数学之前考, 有多少种不同的安排顺序?
对等法: “语文在数学之前”和”语文在数学之后”的情况是等价的, 所以答案就是$P_9^9/2$
某个班级共有43位同学, 从中任抽5人, 正、副班长、团支部书记至少有一人在内的抽法有多少种?
排异法: 用总情况数减去三人都不选的情况, 避免分类讨论. 答案: $C_{43}^5-C_{40}^5$
将8个相同的球放入3个不同盒子中, 每个盒子至少放一个, 有几种方法?
隔板法: 7个空位放2个板, 有$C_7^2$中办法.
将8个相同的球放入3个不同盒子中, 盒子可以为空, 有几种方法?
隔板法: 两块板 + 8个球共10个元素, 方法数相当于从10个位置里选两个放板, 所以有$C_{10}^2$种方法
隔板法和插空法的区别: 隔板法要求球相同
特殊的排列组合问题
圆排列: 从n个不同的元素中取r个沿一圆周排列.
\[\frac{P_n^r}{r}\]有重复元素的排列: 分别有$n_1, n_2, \cdots, n_i$个不同的元素.
\[\frac{(n_1+n_2+\cdots+n_i)!}{n_1!n_2!\cdots n_i!}\]递推关系
错排问题
第i个元素不在i位置上的排列总数. 考虑两种情况:
- 先错排前$n-1$个, 然后$n$与前$n-1$之一交换.
- $n$与前$n-1$个之一交换, 再剩下$n-2$个.
第一类 Stirling 数
n个不同元素构成m个圆排列的方案数. 考虑第n个元素:
- 单独组成一个圆排列
- 插到之前$n-1$个数之一的左边
第二类 Stirling 数
将n个不同的元素拆分成m个集合的方案数.
n个有区别的球放到m个相同的盒子中, 要求无一空盒, 其不同的方案数用$S(n,m)$表示,称为第二类 Stirling 数. 设有每个球分别为$b_1, b_2, \cdots, b_n$, 考虑放置$b_n$
- 令$b_n$独占一个新的盒子.
- 把$b_n$放进现有的一个放了球的盒子里
注意隔板法是相同球进不同盒, 这里是不同球进相同盒.
Catalan 数
推荐阅读: 卡特兰数 — 计数的映射方法的伟大胜利
令$C(0)=1, C(1)=1$, Catalan 数满足:
\[C(n) = C(0)C(n-1) + C(1)C(n-2) + \cdots + C(n-1)C(0)\] \[C(n) = \frac{4n-2}{n+1}C(n-1)\] \[C(n) = \frac{C_{2n}^n}{n+1} = \frac{P_{2n}^n}{(n+1)!} = \frac{(2n)!}{n!(n+1)!}\]- 一个足够大的栈的进栈序列对应的出栈序列的种数: 考虑最后出栈的是第i个元素, 所以比i先出栈有$C(i-1)$种方案, 比i后出栈有$C(n-i)$种方案, i取遍1到n就是上面的递推式.
- n个节点的二叉树种类数: 考虑中序遍历的序列, 树根为i, 则左子树的方案数为$C(i-1)$, 右子树的方案数为$C(n-i)$, 又得到了上面的递推式
-
凸多边形的三角形划分: 一个凸的n边形, 用直线连接他的两个顶点使之分成多个三角形, 每条直线不能相交, 问一共有多少种划分方案. 解法见图:
- $n\times n$的方格图中, 只能向右或向上, 从$(1,1)\rightarrow(n,n)$不跨越对角线的方法数. HDU 3398. 其他的一些也可以抽象为这个走格子的模型.
- 由n对括号形成的合法括号表达式数: 类比出栈序列.
-
用n个长方形去填充一个高度为n的阶梯图形的方法数:
考虑包含最左上角的方块的矩形对应的是哪一个阶梯, 然后分为下边和右边两部分, 得到卡特兰数的递推公式.
集合取数问题
设$f(n,k)$是从集合${1,2,\cdots,n}$中能够选择的没有两个连续整数的k个元素子集的数目, 求递归式$f(n,k)$. 考虑第n个数:
- 要放第n个数, 所以不能放第$n-1$个数
- 不放第n个数
也可以用插空法模型来解决问题.
整数划分问题
将整数n分成k份, 且每份不能为空, 不考虑顺序互不相同的方法数. 令$f(n, k)$表示把n分为k份的方案数, 两种情况:
- 分出来的k份每一份都大于一, 所以先从n中取出k来摊在每一份上, 再分了剩下的$n-k$.
- 分了一个1出来. 剩下的再说.
自然数n的拆分方案:
\[\sum_{i=2}^n(f(n, i))\]特征根法
数列${f}$满足递推关系式:
\[f_n = af_{n-1} + bf_{n-2}\]为得到其函数形式, 需将两边整理为类似$\lambda(f_n-rf_{n-1})=f_{n-1}-rf_{n-2}$的结构. 展开得
\[f_n=\frac{r+1}{\lambda}f_{n-1} - \frac{r}{\lambda}f_{n-2}\] \[\lambda+r = a, \lambda r = -b\]即$\lambda, r$是方程$x^2=ax+b$的两根.
经过化简可得到
\[f_n = c\lambda^n+ds^n\]其中$c,d$可通过待定系数法解得.
不动点法
数列${f}$满足递推关系式:
\[f_n = \frac{af_{n-1}+b}{cf_{n-1}+d}\]令$p,q$为方程$x = \frac{ax+b}{cx+d}$的两根
-
若$p\neq q$
则$\frac{f_n-p}{f_n-q}$是以$\frac{a-cp}{a-cq}$为公比的等比数列, 进一步可用待定系数法确定$f_n$.
-
若$p=q$
则$\frac{1}{f_n-p}$是以$\frac{1}{a_1-p}$为首项, $\frac{2c}{a+d}$为公差的等差数列.
时间复杂度
NOIP2017 D1T2
P, NP, NPC, NP-Hard
推荐阅读: P问题、NP问题、NP完全问题和NP难问题
简称 | 英文 | 定义 | 例子 |
---|---|---|---|
P问题 | P: polynominal | 存在多项式时间算法的问题 | 冒泡排序 |
NP问题 | NP: Nondeterministic polynominal | 能在多项式时间内验证一个正确解的问题 | TSP |
NPC问题 | NPC: Nondeterminism Polynomial Complete | 存在这样一个NP问题, 所有的NP问题都可以约化成它. (只要解决了这个问题, 那么所有的NP问题都解决了) | 逻辑电路问题(给定一个逻辑电路, 问是否存在一种输入使输出为False ), Hamilton 回路, TSP |
NP 难问题 | NP Hard | 所有的NP问题都能约化到它, 但是他不一定是一个NP问题 | 并没有 |
我们感兴趣NP问题是否都是P问题(P == NP
?)(如果是的, 那么所有NP问题都可以用计算机来解决了), 在研究这一点的过程中, 我们发现了一类特殊的NP问题, 解决它就可以解决所有的NP问题, 称之为NPC问题. 解决NP-Hard问题也可以解决NP问题, 但是NP-Hard问题不一定是NP问题.
P=NP
至今仍未被证明或推翻, NPC问题的发现使得情况更加微妙了.
Master 定理
推荐阅读: Master 定理学习笔记
记号 | 意义 |
---|---|
$\Theta$ | 等于 |
$O$ | 小于等于 |
$o$ | 小于 |
$\Omega$ | 大于等于 |
$\omega$ | 大于 |
记不到就都当做一样的就是了
简单来说, 如果一个算法的时间复杂度能表示为一个如下所示的递推关系式:
\[T(n) = aT(\frac{n}{b}) + f(n)\]那么$T(n)$的复杂度可以通过如下分类讨论得到:
-
$f(n)=O(n^c), c<\log_ba$则有
\[T(n) = O(n^{\log_ba})\]如$T(n)=8T(\frac{n}{2})+1000n^2$的复杂度为$O(n^{\log_28})=O(n^3)$.
-
$f(n)=O(n^c), c>\log_ba$则有
\[T(n) = O(f(n))\]如$T(n)=2T(\frac{n}{2})+n^2$的复杂度为$O(n^2)$.
-
存在一个非负整数$k$使$f(n)=\Theta(n^{\log_ba}\log^kn)$
\[T(n)=\Theta(n^{\log_ba}\log^{k+1}n)\]如$T(n)=2T(\frac{n}{2})+10n$的复杂度为$\Theta(n\log n)$
简单来说就是$f(n)$和$n^{\log_ba}$谁增长快听谁的, 两个一样加个$\log n$.