数学集
向量
(有方向的值叫做向量)
定义?
这个东西放在平面直角坐标系里会好理解一些所以开始吧:
向量是有一个起点\((x1,y1)\)与一个终点\((x2,y2)\)的,而这个向量的值我们就表示为:\((x2-x1,y2-y1)\)
向量是可以平移的,由于平移,那么起点与终点坐标之差是不变的,所以移动向量,向量的值也不便。
那么放在平面直角坐标系时,我们可以把起点就设为原点,那么这个向量的值就将会是终点的坐标,相当于是将其平移,使起点与原点重合。
计算?
向量加法
课本里有一个三角形法则平行四边形法则,我感觉没有必要,因为两个向量相加,我们可以看成一个点的移动,由于已经放入了平面这叫坐标系,那么我们的移动方向其实就是移动值的正负,于是先按照第一条向量的长度要求来移动,再按照第二个向量的长度要求来移动即可。
向量数乘
(别问我减法呢?)
数乘指的是一个数乘一个向量,相当于是一堆这个向量相加,所以将向量的每个值乘一个要乘的数即可。
那么一个向量的相反向量,即往相反方向走,既是将向量乘一个 \(-1\)。
向量减法
与其做减法,不如做加法,直接将减数乘 \(-1\) 然后相加即可。(啊,说的好抽象)
点积(数量积)
\(|\vec{a}|\) 指向量长度即起点终点之间的欧氏距离。
定义为:\(\vec{a}\bullet\vec{b}=|\vec{a}|\times |\vec{b}| \times \cos(\Theta)\)
我们有:\(|\vec{a}|^2=\vec{a}\bullet\vec{a}\)
在平面直角坐标系中,两向量 \(\vec{a}(x1,y1)\vec{b}(x2,y2)\) 的向量积为:\(x1x2+y1y2\) 证明如下:
设一个平面直角坐标系,将两个单位设为 \(i, j\),两个向量 \(a, b\),坐标分别为 \((x1,y1)(x2,y2)\)
\(a\bullet b=|a|\times |b| \times \cos(\Theta)=(ix1+jy1)\bullet(ix2 + jy2)=iix1x2+ijx1y2+ijy1x2+jjx2y2=x1x2+y1y2\)
叉积(我终于不知道这个东东叫个啥了)
定义为:\(\vec{a}\times\vec{b}=|\vec{a}|\times |\vec{b}| \times \sin(\Theta)\)
在平面直角坐标系中,两向量 \(\vec{a}(x1,y1)\vec{b}(x2,y2)\) 的叉积为:\(x1y2-x2y1\),证明如下:
设一个平面直角坐标系,将两个单位设为 \(i, j\),两个向量 \(a, b\),坐标分别为 \((x1,y1)(x2,y2)\)
\(a\times b=|a|\times |b| \times \sin(\Theta)=(jx1+iy1)\times(jx2+iy2)=jx1jx2+jx1iy2+iy1x2+iy1iy2=x1y2-y1x2\)
叉积求面积
这里只用三角形做示范,因为其它的都可以被分成一堆的三角形。
有三角形 \(ABC\)
面积公式中有一个为底乘高除二,然后找到一个点 \(A\),像另外两点 \(B, C\) 做向量,叉积的定义里的 \(|\vec{b}| \times \sin(\Theta)\),放到这里就是 \(|\vec{AC}| \times \sin(\Theta)\),那么对于这个东西,其实就是过 \(C\) 相 \(AB\) 做垂,垂足为 \(D\),那么叉积会变成:\(AB\times AD\),最后除个二,其实就是面积公式
康托展开
对于 \(1\) 到 \(n\) 的全排列,建立排名和排列的双向映射。
理解:由排列映射到排名可以视为一种哈希。
原理:设有 \(1\) 到 \(n\) 的某个排列 \(p_i\),其排名应该等于小于该排列的数量 \(+ 1\)
\(\sum\limits_{i=1}^{n}a_i(n-i)!\) \((a_i=\sum\limits_{j=i + 1}^{n}(p[j]<p[i]))\)
卡特兰数
是一种数列,其通项公式的一种形式为:\(Cat_n=\frac{1}{n+1}\times C_{2n}^n\)
另一种为:\(Cat_n = C_{2n}^{n}-C_{2n}^{n-1}\)
递归定义式
- \(Cat_n=\sum\limits_{i=0}^{n-1}Cat_i\times Cat_{n-i-1}\)
理解:对于 \(n\) 个点构成的二叉树,其形态有 \(Cat_n\) 种
- \(Cat_n=Cat_{n-1}\times \frac{4n-2}{n+1}\)
使用场景
递归式 \(1\) 适用于 \(n\) 不大的情况下求卡特兰数,不用处理除法。\((n\le 500)\)
例1. 01 排列问题
给定 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 共 \(2n\) 个元素的数列,要求该数列的前缀,\(0\) 的个数不少于 \(1\) 的个数,求方案数。
起点左下角 \((0, 0)\),重点 \((n, n)\),往右走为 \(0\),往上走为 \(1\),那么路径方案书为:\(C_{2n}^{n}\)
与 \(01\) 合法排列对应的方案,应该不越过左图红色对角线
将原路径第一次接触新对角线(紫色)之后的路径沿新对角线反转,则原路径与以 \((n-1,n+1)\) 结尾的新路径一一对应。
那么求原路径中的非法路径数量等价于求以 \((n-1,n+1)\) 结尾的路径数量:\(C_{2n}^{n}-C_{2n}^{n-1}=Cat_{n}\)
例2. 给定 \(n\) 个左括号和 \(n\) 个右括号,其合法的匹配序列的方案数为卡特兰数
例3. 给定 \(n\) 个元素,从 \(1\) 到 \(n\),其进出栈的不同方案数为卡特兰数
例4. 给定 \(n\) 条边的凸多边形,用 \(n - 3\) 条边划分成 \(n - 2\) 个三角形,其方案数为卡特兰数
\(prufer\) 序列
是一种树形结构与序列相互映射的规则。
区别
\(dfs\) 序,将一棵子树映射为一段连续的区间
欧拉序
二叉搜索树
\(prufer\) 序列是和树的双向唯一映射,同时包含了结点的读书与连接关系,将构造树转化为构造序列,将统计树的信息转化为统计序列的信息,将树 \(dp\) 转化成序列 \(dp\)
如何得到
- 统计树上所有结点的度数 \(deg_i\)
- 找到所有度数为 \(1\) 的结点中编号最小的那个 \(cur\)
- 令序列 \(p_i = fa_{cur}\),同时将 \(deg_{fa_{cur}} - 1\)
- 重复 \(2,3\),直到剩余两个点时结束
void to_p() {
int k;
for (int i = 1; i <= n; i++) {
if (deg[i] == 1) {
k = i;
break;
}
}
for (int i = 1, j = k; i <= n - 2; i++) {
int nf = fa[j];
p[i] = nf;
deg[nf]--;
if (deg[nf] == 1 && nf < k) {
j = nf;
continue;
}
for (k++, j = k; deg[k] != 1; k++, j = k) {
}
}
}
性质
- 结点 \(x\) 在 \(prufer\) 序列中出现次数加 \(1\) 就是 \(deg_x\)
- 编号最大的点 \(n\) 一定是剩下的 \(2\) 个结点之一
- 对于 \(n\) 个点的完全图,其生成树的方案数为 \(n^{n-2}\)
- 对于 \(n\) 个点的无根树,其树的方案书为 \(n^{n-2}\)
- 对于 \(n\) 个点的有根树,其树的方案书为 \(n^{n-1}\)
- 对于 \(n\) 个点,约定点 \(i\) 的度数为 \(d_i\),满足条件的树的方案数为 \(\frac{(n-2)!}{\prod\limits_{i=1}^n(d_i - 1)!}\)
还原
void to_t() {
for (int i = 1; i <= n; i++) {
deg[i]++, deg[p[i]]++;
}
int k, cnt = 0, j;
for (int i = 1; i <= n; i++) {
if (deg[i] == 1) {
k = j = i;
break;
}
}
for (int i = 1; i <= n - 2; i++) {
int nf = fa[j] = p[i];
deg[nf]--;
if (deg[nf] == 1 && nf < k) {
j = nf;
continue;
}
for (k++, j = k; deg[k] != 1; k++, j = k) {
}
}
fa[j] = n;
}
基本计数原理
- 加法原理:解决一件事情,有 \(k\) 类方法,第 \(i\) 类方法有 \(a_i\) 种选择,那么总方案数 \(= \sum\limits_{i=1}^{k}a_i\)
- 乘法原理:解决一件事情,有 \(k\) 个步骤,第 \(i\) 个步骤有 \(a_i\) 种选择,那么总方案数 \(= \prod\limits_{i=1}^ka_i\)
排列与组合
- 排列:将 \(n\) 个元素选取 \(k\) 个出来构成一组排列,方案数 \(=A_{n}^{k}=\frac{n!}{(n-k)!}\)
- 组合:将 \(n\) 个元素选取 \(k\) 个出来构成一组集合,方案数 \(=C_{n}^{k}=\frac{A_{n}^{k}}{k!} = \frac{n!}{k!(n-k)!}\)
多重集的排列数与组合数
多重集排列数是指 \(k\) 种元素,第 \(i\) 种元素有 \(a_i\) 个,总元素个数为 \(n\),其全排列的方案数 \(=\frac{n!}{\prod\limits_{i=1}^ka_i!}\)
多重集组合数 1:
设有 \(k\) 种元素,第 \(i\) 种元素的个数为 \(a_i\),取共计 \(r\) 个元素构成集合,且 \(r \le a_i\),其组合数 \(=C_{k-1}^{r+k-1}\)(将 \(r\) 个元素分成 \(k\) 类,可以有一类没有)
组合数常用性质
- \(\sum\limits_{i=0}^{n}C_{n}^{i} = 2^n\)
- \(C_{n}^{m} = C_{n}^{n - m}\)
- \(C_{n}^{m} = C_{n - 1}^{m - 1} + C_{n - 1}^{m}\)
二项式定理
\((a+b)^n=\sum\limits_{i=0}^{n}C_{n}^{i}\times a^i \times b^{n-i}\)
组合数计算
- 杨辉三角递推计算
- 定义式计算
错位排序
有 \(n\) 个位置和 \(n\) 个小球,编号均为 \((1,n)\),所有小球 \(i\) 不放入位置 \(i\) 的方案总和为 \(f_n\):
- 若前面的已错位排序,那么只要将当前的与之前的换一下即可:\((i-1)*f_{i-1}\)
- 若前面恰好有一个没错位,那么只要将当前的与前面的换一下即可:\((i-1)*f_{i-2}\)(有 \(i - 2\) 已经错位排序)
- 若都不满足,一次操作必然不可能使它错位,所以贡献为 \(0\)
所以 \(f_i=(i-1)(f_{i-1}+f_{i-2})\)
卢卡斯定理
对于正整数 \(n,m,p\),若 \(1 \le m \le n\) 且 \(p\) 为质数那么 \(C_{n}^{m}\equiv C_{n \bmod p}^{m \bmod p}\times C_{\frac{n}{p}}^{\frac{m}{p}}\pmod{p}\)
变式
设 \(a_i\) 为 \(n\) 在 \(p\) 进制下的第 \(i\) 位,设 \(b_i\) 为 \(m\) 在 \(p\) 进制下的第 \(i\) 位
\(C_{n}^{m}\equiv \prod C_{a_i}^{b_i}\pmod{p}\)
费马小定理
若 \(p\) 为质数,且 \(p \nmid a\),有 \(a^{p - 1} \equiv 1 \pmod{p}\),不给证明,只记结论。
-
那么 \(\frac{x}{a}\) 在模 \(p\) 意义下为 \(\frac{x}{a} \equiv \frac{x}{a} \cdot a^{p - 1} \equiv x \cdot a^{p - 2} \pmod{p}\)
-
\(a\) 在模 \(p\) 意义下的乘法逆元为 \(a^{p - 2}\) (\(p\) 为质数,\(p \nmid a\))
记作:\(a^{-1} = a^{p-2} \pmod{p}\)
位运算的一个定理
\(x + y = 2(x \And y) + (x \oplus y)\)
\(x \mid y = (x \And y) + (x \oplus y)\)
线性计算逆元的小技巧:
设:\(a=\left\lfloor\dfrac{p}{x}\right\rfloor\),\(b = p\; mod\; x\)
\(\therefore ax+b \equiv p \pmod{p}\)
\(\therefore ax \equiv -b \pmod{p}\)
\(\therefore x \equiv -\frac{b}{a} \pmod{p}\)
\(\therefore x^{-1} \equiv -\frac{a}{b} \pmod{p}\)
\(\therefore x^{-1} \equiv -a\cdot \frac{1}{b} \pmod{p}\)
\(\therefore x^{-1} \equiv -a\cdot b^{-1} \pmod{p}\)
所以可以递推求解,对于 \(b^{-1}\) 之前显然已经求解过了,所以时间复杂度是线性的。
\((p^x-1^x)\)分解因式
首先可以将式子拆成:\((p-1)y\),然后构造式子 \(y\),使得 \((p-1)y=(p^x-1^x)\)。
首先式子需要一个 \(p^x\),所以 \(y\) 需要加上 \(p^{x-1}\),\(y\) 变成:
\(y = (p^{x-1})\)
那么此时 \((p-1)y = p^{x}-p^{x-1}\),我们发现多了一个 \(-p^{x-1}\),所以删掉一个 \(-p^{x-1}\),\(y\) 变成:
\(y=(p^{x-1}+p^{x-2})\)
然后以此类推……
到最后便成了 \(y=(p^{x-1}+p^{x-2}+p^{x-3}+\cdots+p^{0})\),将 \(y\) 带入式子,则变成 \((p-1)(p^{x-1}+p^{x-2}+p^{x-3}+\cdots+p^{0})\)。
所以可以扩展 \((a^x-b^x)\),则应该为 \((a-b)(ab^{x-1}+ab^{x-2}+ab^{x-3}+\cdots+ab^{0})\)