数学笔记

整除

什么是整除,字面意思,比如 \(b = a \times q\)

\(a \mid b\) ,可以理解为 \(b\)\(a\) 的倍数。

整除有几个性质:

\(a \mid b\)\(b \mid c\) ,则 \(a \mid c\)

证明显然,设 \(b = a \times q, c = p \times b\)\(c = p \times q \times a\)

所以 \(a \mid c\)

假设 \(1 \le m\) ,且 \(a \mid b\) ,则 \(a \times m \mid b \times m\)

​ 证明也很显然,两边同乘上 \(m\) 后都多了个 \(m\) 的因子。

\(a \mid b\)\(a \mid c\), 则 \(a \mid x \times b + y \times c\)

\(b\)\(c\) 都是 \(a\) 的倍数,右边可以写成 \(x \times p \times a + y \times q \times a\)

然后右边是个 \(a\) 的倍数。

设整数 \(x\)\(y\) 满足 \(ax + by=1\),且 \(a \mid n, b \mid n\),则 \(ab \mid n\)

因为 \(a \mid n, b \mid n\) ,两边同乘上 \(a\) 或者 \(b\) 还是成立的;

就有了 \(ab \mid bn, ab \mid an\),然后根据刚才证明的第 \(3\) 条性质:

又有了 $a \times n \times x + b \times n \times y $,提完公因数,发现里面的式子刚好为 \(1\)

证明完成。

其实这些东西你不会证明也没关系,因为你就算会证明你也不会用

同余

还是字面意思。

可以理解为余数相同。

比如 \(a \bmod m=1, b \bmod m=1\),则 \(a \equiv b(\bmod m)\)

同余有一些性质,两边同加,乘,幂依旧同余。

然后同余构成了一个关于这个余数的剩余系,为 \([0, m - 1]\)

然后对于负数,他也在这个剩余系里,那他是谁呢。

举个例子啊。

\(-3 \bmod 7 = 4\)

证明一下 : \(-3 + 3 \bmod 7 = 0, 4 + 3 \bmod 7 = 0\)

证明完成?

素数和合数:

素数就是指只能被 \(1\) 和 他本身整除的数。

有三种筛素数的方法。

  • 暴力筛

复杂度为 \(\mathcal{O}(n \sqrt n)\)

只筛到 \(\sqrt n\) 是因为:

\(n\) 为合数,那他就可以表示成两个数的乘积的形式,\(n = x \times y\),当你 \(x\) 确定的时候,\(y\) 也确定了, \(y = \frac {n}{x}\)

所以 \(x\)\([2, \sqrt n ]\)\(y\) 就一定在 \([\sqrt n + 1, \frac{n}{2}]\) 里。

所以说当你扫到 \(n\) 的时候,\(x\)\(y\) 就相当于交换了一下,没有意义。

给个代码:

bool Check(int x) {
	for(int i = 2; i * i <= x; i++) 
		if(x % i == 0) return false;
	return true;
}
  • 埃氏筛

当你扫到一个数是素数的时候,他的倍数必然不是个素数,都标记上。

复杂度为 \(\mathcal{O}(n \log \log n)\)

这玩意能过线性筛的模板,跑的比部分人写的线性筛还快

void Prime(int n) {
	vis[1] = 1;
	for(int i = 2; i <= n; i++) {
		if(vis[i]) continue;
		prime[++cnt] = i;
		for(int j = i; j <= n; j += i) {
			vis[j] = 1;
		}
	}	
}
  • 线性筛

使每一个数都只筛一遍,这样复杂度就是 \(\mathcal{O}(n)\)

在筛的时候加上了一句话, 如果满足 \(i \bmod prime[j] == 0\) 就直接 \(break\)

为啥这样是对的呢。

当 $ prime[j] \mid i$,这个时候就可以直接跳了。

\(i = k \times prime[j]\),那 \(i * prime[j + 1] = (k \times prime[j]) \times prime[j + 1]\)

我们设 \(k' = (k \times prime[j + 1])\),所以说 \(i \times prime[j + 1]\) 就可以用 \(k' \times prime[j]\) 来表示,这样的话这个 \(i \times prime[j + 1]\) 会被筛到两次,所以我们只要在他被整除的时候直接跳出来就行了。

void Prime(int n) {
	vis[1] = 1;
	for(int i = 2; i <= n; i++) {
		if(!vis[i]) prime[++cnt] = i;
		for(int j = 1; j <= cnt && i * prime[j] <= n; j ++) {
			vis[i * prime[j]] = 1;
			if(i % prime[j] == 0) break;	
		}
	}	
}

斐蜀定理:

又称为贝祖定理, 一个关于最大公约数的定理。

内容是:

\(a,b\) 不是全为 \(0\) 的整数,\(ax + by = \gcd(a, b)\) 一定有整数解。

证明: 自己看看?

这里口胡一下:

\(a, b\) 有一个为 \(0\) 时显然成立。

\(a, b\) 都不为 \(0\) 时,因为负数无影响,所以我们都看出正数。

\(d = \gcd(a, b)\)

\(ax+by=d -> \frac{a}{d}x + \frac{b}{d}y=1\)

然后用辗转相除不断的递归回来就证明完成了?

唯一分解定理:

任意一个大于 \(1\) 的自然数,都能被分解成有限个质数乘积的形式。

\(n = \prod_{1}^{k} p_i^{a_i}\)

这里的 \(p_i\) 指的是质数, \(a_i\) 是对应的指数。

这样的分解式被称为标准分解式。

唯一分解定理有两个性质:

  • 唯一性

  • 存在性

费马小定理:

\(p\) 为素数,且 \(gcd(a, p) == 1\),则 \(a^{p - 1} \equiv 1 (\mod p)\)

威尔逊定理:

\((p−1)!≡−1(\bmod p)\)

欧拉定理

\(p\) 为素数, 且 \(\gcd(a, p) = 1\),则 \(a^b \equiv a^{b \bmod \varphi(m)} (\bmod m)\)

扩展欧拉定理:

\(a^b \equiv a ^ {b \bmod \varphi(m) + \varphi(m)} (\bmod m)\)

最大公约数

若满足 \(d \mid a,d \mid b\),且没有一个比 \(d\) 还大的数满足这个条件,那我们称 \(d\)\(a\)\(b\) 的最大公约数。

记作 \(d = \gcd(a, b)\)

若满足 \(a \mid d,a \mid d\),且没有一个比 \(d\) 还小的数满足这个条件,那我们称 \(d\)\(a\)\(b\) 的最小公倍数。

记作 \(d = lcm(a, b)\)

有一个性质:

\(a \times b = \gcd(a, b) \times lcm(a, b)\)

证明一下:

\(x = \gcd(a, b), y = lcm(a, b)\)

那么 \(a = m \times x, b = n \times x\),同时 \(gcd(m, n) = 1\)

那么 \(y = m \times n \times x\)

\(x \times y = x \times (m \times n \times x) = (m \times x) \times (n \times x) = a \times b\)

证明完毕。

怎么求这个最大公约数呢?

  • 辗转相除法
  int gcd(int a, int b) {
      return !b ? a : gcd(b, a % b);
  }

证明 :

也就是证明 \(\gcd(a, b) = \gcd(b, a \% b)\)

于是我们转换成证明 \(2\) 个东西:

\(\gcd(a, b)\)\(b, a \% b\) 的公约数。

证明:设 \(gcd(a, b) = d\),则 \(a = k_1 d, b = k_2 d\)

\(a = kb + c\)\(a \% b = c = a - kb\)

\(a - kb = k_1d - kk_2d = (k_1 - kk_2) d\),所以 \(a \% b\) 也有这个公约数,而 \(b\) 也有。

所以得证。

并且这个公约数是最大公约数。

证明这个也就是证明 \(a \% b\)\(b\) 没有比 \(d\) 还大的公约数,也就是 \(k_2\)\(k_1 - kk_2\) 互质。

正难则反,我们采用反证法:

我们假设 \(k_2\)\(k_1 - kk_2\) 有公约数。

所以假设 \(k_2 = qt, k_1 - kk_2 = pt\)

\(k_1 = pt + kk_2\)\(a = k_1d = (pt + kk_2) d = ptd + kk_2d\)

因为 \(k_2d = b\),所以 \(a = ptd + kb\)

\(b = k_2d = qtd\),所以 \(a = ptd + kqtd = (p + kq) td\)

所以 \(\gcd(a, b) = td\) 不满足条件,与 \(\gcd(a, b) = d\) 矛盾,证明成功。

扩展欧几里得算法

\(exgcd\) 是一种求解 \(ax + by = \gcd (a,b)\)\(log\) 解法。

根据贝祖定理,一定有解。

\(ax + by = \gcd(a,b) = \gcd(b, a \% b)\)

\(\gcd(a, b) = bx'+ (a \% b) y'\)

\(= b'x + (a - \left \lfloor \frac{a}{b} \right \rfloor b) y'\)

\(=bx' + a y' - \left \lfloor \frac{a}{b} \right \rfloor b y'\)

\(= ay' + b(x' - \left \lfloor \frac{a}{b} \right \rfloor y)\)

\(= ax + by\)

所以 \(x = y', y = (x' - \left \lfloor \frac{a}{b} \right \rfloor y)\)

  • 求通解:

也就是求 \(ax + by = k \gcd(a, b)\)

假设我们已经求出 \(ax_0 + by_0 = \gcd(a, b)\)

\(c = k \gcd(a, b)\), 所以 \(k = \frac{c}{\gcd(a, b)}\)

\(ax_0 + by_0 = \gcd(a, b)\)

\(= k (ax_0 + by_0) = k\gcd(a, b)\)

\(= a \frac{cx_0}{\gcd(a, b)} + b \frac{cy_0}{\gcd(a, b)} = c\)

\(ax_1 + by_1 = c\)

\(x_1 = \frac{cx_0}{\gcd(a, b)}, y_1 = \frac{cy_0}{\gcd(a, b)}\)

对于任意的 \(d \in \Q\), 一定有:

\(a(x_1 + db) + b (y_1 - da) = c\)

化简一下就是 \(a_x1 + abd + by_1 - abd = c\)

显然正确。

因为我们找到是整数解,因为 \(x_1, y_1 \in \Z\)

所以我们要让 \(db, da \in \Z\)

\(d\) 最小时显然为 \(\frac{1}{\gcd(a, b)}\)

所以 \(d_y = da = \frac{a}{\gcd(a, b)},d_x =db = \frac{b}{\gcd(a, b)}\)

通解的形式变成了 \(x = x_1 + kd_x, y = y_1 - kd_y\)

(其中 \(k \in \Z\)

乘法逆元

如果说 \(ax \equiv 1 (\bmod p)\) ,那么称 \(x\)\(a\) 关于 \(p\) 的乘法逆元。

记作 \(inv(a) = x\)

逆元一般用来处理 \(\frac{a}{b} \bmod p\) 的问题。

\(k = inv(b)\),则 \(\frac{a}{b} \bmod p = ak \bmod p\)

证明:

\(\frac{a}{b} \bmod p\)

\(= \frac{a}{b} \bmod p \times 1\)

$ = \frac{a}{b} \bmod p \times (bk \bmod p)$

$ = (\frac{a}{b} \times bk) \bmod p$

$ = ak \bmod p$

如何求逆元?

\(exgcd\)

发现 \(ax \equiv1(\bmod p)\) 可以写成 \(ax + py = 1\),这个式子可以用 \(exgcd\) 求解。

最后解出来的 \(x\) 就是逆元。

费马小定理:

\(p\) 为素数, \(gcd(a, p) = 1\)\(a^{p - 1} \equiv 1(\bmod p)\)

\(a a^{p - 2} = a ^ {p - 1}\)

所以 \(a^{p - 2}\) 即为逆元。

线性递推逆元。

求出 \([1, n]\) 的逆元。

\(t = p / i, k = p \mod i\)

\(t * i + k = p\),所以 \(t * i + k \equiv 0(\bmod p)\)

两边同时减去 \(t * i\)\(k \equiv -t * i(\bmod p)\)

两边同时除以 \(i * k\), 得到 \(i^{-1} \equiv -t * k^{-1} (\bmod p)\)

因为 \(i^{-1} = inv(i)\)

所以 \(inv[i] \equiv -t * inv[k] (\bmod p)\)

然后将 \(k, t\)\(i, p\) 替换了,\(inv[i] \equiv -(p / i) \times inv[p \bmod i]\)

为了防止出现负数,再加上一个 \(p\),于是变成了 \(inv[i] \equiv p - (p / i) \times inv[p \bmod i]\)

于是就可以线性递推了。

高斯约旦消元法

右转我的另外一篇博客

中国剩余定理 (CRT)

求解 \(x \equiv a_i (\bmod m_i)\) (满足 \(m_i\) 两两互质)。

构造一组解满足条件。

\(M = \prod_{i = 1}^{k} m_i\)\(M_i = \frac{M}{m_i}\)

\(\gcd(M_i, m_i) = 1\),则 \(M_i\) 关于 \(m_i\) 的逆元 \(t_i\) 存在。

所以 \(M_i t_i \equiv 1 (\bmod m_i),M_i t_i \equiv 0 (\bmod m_j)(j \ne i)\)

两边同时乘上 \(a_i\),得到:\(M_i t_i a_i \equiv a_i (\bmod m_i),M_i t_i a_i \equiv 0 (\bmod m_j)(j \ne i)\)

所以最后的解为 \(\sum_{i =1}^{n} M_i t_i a_i\)

显然对于每一组都成立。

扩展中国剩余定理 (EXCRT)

和中国剩余定理没有什么关系。

本质上是合并同余方程组。

求解 \(x \equiv a_i (\bmod m_i)\)

\(M = \prod_{i=1}^{k-1}m_i, x_{k-1}\) 为前 \(k-1\) 个方程的解。

\(x_{k-1} + tM (t \in \Z)\) 为前 \(k- 1\) 个方程的通解。

我们要求一个 \(x_k\) 满足前 \(k-1\) 个方程组的通解,并且也满足第 \(k\) 个方程。

\(x_k = x + tM (t \in \Z)\)

\(k\) 个方程为 \(x_k \equiv a_k (\bmod m_k)\)

带入进去 : \(x_{k-1} + tM \equiv a_k (\bmod m_k)\)

\(tM \equiv a_k - x_{k-1} (\bmod m_k)\)

然后这个式子可以写成: \(tM = a_k - x_{k-1} + m_k \times y\)

\(tM - m_k \times y = a_k - x_{k-1}\)

这个式子形如 \(ax+by=c\),所以可以用 \(exgcd\) 求出 \(t\) 从而求出 \(x_k\) 来。

然后不断的合并就行了。

Miller_Rabin 素数测试

一种快速的测试一个数是否是质数的方法。

矩阵

右转我的另外一篇博客

欧拉函数:

\(\varphi(n)\) 表示
\([1, n]\) 中与 \(n\) 互质的数的个数。

\(1.\)\(p\) 为质数,则 \(\varphi(p^k) = (p - 1) \times p^{k -1}\)

  • 证明 \(:\)

\([ 1, p^k]\) 的数中,与 \(p\) 不互质的数一定可以写成一个集合 \(S = \{a\mid a = p \times b \mid b \in \Z\}\)

我们只需要求出最大的 \(b\) 即可知道与 \(p\) 不互质的数的个数。

因为 \(p^k = p \times p^{k- 1}\),所以与 \(p\) 不互质的数的个数有 \(p^{k -1}\) 个。

所以 \(\varphi(p ^ k) = p^k - p^{k -1} =p^{k-1} \times p - p^{k-1} = p^{k-1} \times (p -1)\)

得证。

\(2.\) 如果 \(p\) 为质数,则 \(\varphi(p) = p - 1\)

  • 证明 \(:\)

由第一条性质得证:当 \(k = 1\) 时。

当然也可以感性理解: \(p\) 是一个质数,所以从 \([1, p)\)
都与 \(p\) 互质。

$3.\ $ \(\varphi\) 函数是一个积性函数,也就是说如果 \(\gcd(a,b)=1\),则 \(\varphi(a \times b) = \varphi(a) \times \varphi(b)\)

  • 证明 \(:\)

\(a\) 互质的数集为 \(a_1,a_2.....,a_{\varphi(a)}\),则在 \([1,a\times b]\) 的范围内与 \(a\) 互质的数可以写成 \(k \times a + a_j ( 0 \le k <b, 1 \le j \le \varphi(a))\)

\(4.\ \varphi(ab) = a \times \varphi(b) \ \ \ \ \ ( a \mid b)\)

咕咕咕

线性筛欧拉函数:

p 指素数。

  • 性质 \(1\): \(\varphi(p) = p - 1\)

  • 性质 \(2\): \(\varphi(i\times p) = p \times \varphi(i) (i \mod p = 0)\)

证明一下:设 \(d\)\(\gcd(p, i)\)

设 $p = k_1d, i = k_2d $,所以 \((p + i) = (k_1 + k_2) d\)

因为 \(gcd(k_1, k_2) = 1\),所以 \(gcd(k_2, k_1 + k_2) = 1\)

\([1, i]\) 里与 \(i\) 不互质的数的个数为 \(i - \varphi(i)\)

\([1, p \times i]\)\(i\) 不互质的数的个数为 \(p (i - \varphi(i))\)

因为 \(i \mod p = 0\),所以 \(i, p\) 的因子都相同。

所以 \(\varphi(i \times p) = p \times i - p \times \varphi(i) = p \times \varphi(i)\)

  • 性质 \(3\): \(\varphi(i \times p) = \varphi(i) \times (p - 1) (i \mod p != 0)\)

鸽巢定理:

\(n\) 个抽屉,有 \(n + 1\) 个物品,你要将这 \(n + 1\) 个物品放到这 \(n\) 个抽屉里,至少有一个抽屉有 \(2\) 个及其以上个数的物品,同理,当你有 \(n - 1\) 个物品的时候,有一个抽屉会是空的。

证明:

如果想让每个抽屉中的物品个数尽量少,就要将这些物品平摊到这些抽屉中,所以当 \(n\)个物品分别放到 \(n\) 个抽屉里的时候,最后一个物品一定会放到一个已经有一个物品的抽屉里了,当 \(n\) 个物品不平摊的时候就更不用说了, \(n - 1\) 个物品的时候同理可证。

来个例题:

你有一个边长为 \(2\) 的等边三角形,要在这里面放 \(5\) 个点,可以放到三角形的订点上,求证:至少存在两个点满足两点之间的距离 \(\le 1\)

证明:

我们可以将这个边长为 \(2\) 的等边三角形分为 \(4\) 个边长为 \(1\) 的等边三角形,然后问题也就转换为了有 \(4\) 个抽屉,有 \(5\) 个物品,将这 \(5\) 个物品放到 \(4\) 个抽屉中,当两个物品在同一个抽屉里距离\(\le 1\),所以问题可证成立。

分类加法、乘法计数原理:

比如你有一个事件 \(A\)\(B\),然后 \(A\) 完成的方式有 \(a\) 种, \(B\) 完成的方式有 \(b\) 种,\(A\)\(B\) 发生的方案数是 \(a + b\)\(A\)\(B\) 同时发生的方案数为 \(a \times b\)

大概说的通俗一点就是:

假如我是小明,我要去 \(A\) 站,有 \(a\) 种火车票, \(b\) 种飞机票,我到 \(A\) 站的方案数就是 \(a + b\)

然后再假设我是小红,我用去 \(B\) 站,不过中途必须经过 \(A\) 站,小红到 \(A\) 站有 \(a\) 种方案,从 \(A\) 站到 \(B\) 站又有 \(b\) 种情况,那么小红到 \(B\) 站的方案数为 \(a \times b\)

DeMorgan 定理

我不会用 \(Markdown\),所以这里我们用 \(S(i)\) 来表示 \(i\) 的补集,假设 \(A.B\) 是全集 \(U\) 的两个子集,那么 \(S(A \cap B)\)\(S(A)\) \(\cup\) \(S(B)\)\(S(A \cup B)\)\(S(A)\) \(\cap\) \(S(B)\)

证明还是比较简单。
具体画个维恩图就会了吧。

然后这个东西是可以推广到有 \(n\) 个子集的。

容斥原理

你有一个有限集为 \(S\),有 \(n\) 条性质,分别是 \(P_1.P_2.P_3\cdots P_n\)\(S\) 中的任意一个子集可能对其性质满足 \(q\)\((0\le q\le n)\),我们设 \(A_i\)表示满足第 \(P_i\) 条性质的集合,\(A_i\) 的集合中元素的个数为 \(|A_i|\)

则满足两条性质:

$|S(A_1) \cap S(A_2) \cdots \cap S(A_n)| = $

$|S| - \sum_i|A_i| + \sum_{i<j}|A_i \cap A_j|-\sum_{i<j<k}|A_i \cap A_j \cap A_k| + \cdots + (-1)^n |A_1 \cap A_2 \cap A_3 \cdots \cap A_n| $

$|A_1|+|A_2|+|A_3|+\cdots + |A_n| = $

$\sum_i|A_i| - \sum_{i<j}|A_i\cap A_j| + \sum_{i<j<k}|A_i \cap A_j \cap A_k| - \cdots +(-1)^{n+1}|A_1 \cap A_2 \cap A_3 \cap \cdots \cap A_n| $

看起来式子挺长,其实就是将重复的部分减去来达到不重不漏罢了。

仔细想一想就能明白。

稳定婚姻问题

形象一点的描述,假设你是一个红娘,你要给 \(n\) 个男子和女子配对,每个男子在每个女子心中都有排名,每个女子在每个男子心中也有一个排名。

如果 \(A_i\)\(B_j\) 已经配对了,但是 \(A_i\)\(A_j\) 同时发现还有比现在的对象更符合自己的,于是两人一拍而合,离!然后这对婚姻就不稳定了。

虽然对两个人都有好处,但是他们离婚会影响你的业绩,所以你要配对的时候尽量满足一种情况,虽然男子有更心仪的女子,但他现在的女子认为该男子就是她最好的配偶,男子想离都没法离,女的根本就不撒手。

是不是十分通俗易懂

当然稳定婚姻的情况肯定是不只有一种情况。

给定你 \(n\) 个男生和 \(n\) 个女生,然后给出每个异性在自己心中的排名,求出一种稳定婚姻。

具体实现也就是用 \(Gale-Shapley\) 算法,我们对于每个未婚的男性,让其向自己的求婚名单上现存最喜欢的女生求婚,不管女生是已婚还是未婚,如果女生能够同意,就结婚,否则男生的求婚名单上就把该女生划了。

例题

然后这题和上面说到的算法没有关系,用的是匈牙利算法,对于每一个男生,我都对于每个女生枚举一遍呢,当这个女生每对象就直接结婚,要是有对象同时她的对象还能喜欢其他女生并且那个女生没有对象,当然也有可能那女生的对象还喜欢其他人并且那个人没结婚,所以就递归实现即可。

AC code :

/*
work by: TLE_Automation
Time: O(TLE)
knowledge:
*/
#include<bits/stdc++.h>
using namespace std;

const int maxn = 3e6;
const int MAXN = 3e3;
inline int read() {
	int s = 0, w = 1;
	char ch = getchar();
	while (!isdigit(ch)) {if(ch == '-') {w = -1;}ch = getchar();}
	while (isdigit(ch)) {s = (s << 1) + (s << 3) + (ch ^ 48);ch = getchar();}
	return s * w;
}

int ans = 0, n, m, t;
int result[maxn];
int Map[MAXN][MAXN];
bool vis[maxn];

bool dfs(int x){
	for(int i = 1; i <= m; i++) {
		if(Map[x][i] && !vis[i]) {
			vis[i] = true;
			if(!result[i] || dfs(result[i])) {
				result[i] = x;
				return true;
			}
		}
	}return false;
}

signed main() {
	n = read(), m = read(), t = read();
	for(int u, v; t; t--) {
		u = read(), v = read();	
		Map[u][v] = true;
	}
	for(int i = 1; i <= n; i++) {
		memset(vis, false, sizeof vis);
		if(dfs(i)) ans++;
	}
	print(ans);
}

组合数学

右转另外一篇博客

卢卡斯定理

\(Lucas(n,m)=C_{n \mod p}^{m \mod P} Lucas(n / p, m / p)\)

数论分块

咕咕咕

莫比乌斯反演

咕咕咕

博弈论

咕咕咕

posted @ 2022-06-10 22:26  TLE_Automation  阅读(105)  评论(1编辑  收藏  举报