ZHX 清北数学 Day4 笔记
ZHX 清北数学 Day4 笔记
一、容斥原理(续)
例题一
$ N $ 对夫妻问题
$ n $ 对夫妻,共 $ 2n $ 人。把他们排成一圈,满足每对夫妻都不能相邻的位置且旋转后相同的方案算一种,求方案数。
首先 $ 2n $ 个夫妻的圆排列是 $ (2n - 1)! $ 种
然后考虑把一对夫妻单独提出来军训
也就是说把这一对夫妻看成一个人,那么圆排列就是 $ (2n - 2)! $
答案变成 $ (2n - 1)! - n \times (2n - 2)! \times 2 $
这里的意思是考虑每对夫妻有两种排法,有 $ n $ 对夫妻
这样算重复了,所以我们再加上两对夫妻的答案:
$ (2n - 1)! - n \times (2n - 2)! \times 2 - C(n, 2) \times (2n - 3)! \times 4 $
以此类推,答案是:
$ \sum_{i = 0}^n (-1)^i \times C(n, i) \times (2n - 1 - i)! \times 2^i $
在这里,$ i $ 表示有 $ i $ 对夫妻强制相邻
例题二
询问 $ 1 $ ~ $ n $ 中有多少个数可以表示成 $ x^y,y > 1 $ 的形式
这个明显容斥
首先考虑 $ y $ 比较小,我们枚举 $ y $
求 $ 1 $ ~ $ n $ 中有多少数可以被表示成 $ x^y,y>1 $(针对一个 $ y $)的答案是 $ \sqrt[y]{x} $
但是我们发现,当 $ y = 2 $ 时,把 $ y = 4 $ 也算了一遍,所以我们考虑要把 $ 4 $ 的减掉
具体 $ y = $ 几才加或减,我们很难算
所以我们考虑编程计算,即计算贡献
考虑用 $ num_i $ 表示当 $ y = i $ 时被计算了几次,所有的 $ num_i $ 都为 $ 1 $ 时才能算出正确的结果
P9118
这个题更改了 $ y $ 的条件,直接从 $ k $ 开始枚举就行
代码:
# include <bits/stdc++.h>
# define int long long
using namespace std;
int num[114];
signed main () {
int n, k;
cin >> n >> k;
if (k == 1) {
cout << n << endl;
return 0;
}
for (int i = k; i <= 64; ++ i) num[i] = 0;
int ans = 0;
for (int i = k; i <= 64; ++ i) {
int v = floor (exp (log (n) / i)) - 1;
int d = 1 - num[i];
ans += v * d;
for (int j = i; j <= 64; j += i) num[j] += d;
}
cout << ans + 1 << endl;
return 0;
}
二、高斯消元
推荐先学习加减消元法解二元一次方程
先看看蒲通普通的多元一次方程:
然后我们使用加减消元法,对于第二个方程,我们令 ② $ - $ ① $ \times \frac{a_{2,1}}{a_{1,1}} $,即可在 ② 中消掉未知数 $ x_1 $,对其他的方程采用同样的操作即可消掉未知数 $ x_1 $,然后我们把第一行的未知数 $ x_1 $ 的系数变成 $ 1 $,令 ① $ \times \frac{1}{a_{1,1}} $
接下来采用同样的方法,把这个方程变成如下形式(采用矩阵表示):
然后我们回来解方程,这也比较简单
我们从最后一行开始解
发现可以解出最后一行
然后把这个未知数的值存下来,带入到上一行,就又可以解出另一个未知数
代码如下:
// 普通高斯消元
inline void gauss () {
for (int i = 1; i <= n; ++ i) {
for (int j = i; j <= n; ++ j) {
if (fabs (a[j][i]) > fabs (a[i][i])) {
for (int k = 1; k <= n + 1; ++ k) {
swap (a[i][k], a[j][k]);
}
}
}
for (int j = i + 1; j <= n; ++ j) {
double r = a[j][i] / a[i][i];
for (int k = 1; k <= n + 1; ++ k) {
a[j][k] -= a[i][k] * r;
}
}
}
for (int i = n; i >= 1; -- i) {
for (int j = i + 1; j <= n; ++ j) {
a[i][n + 1] -= a[i][j] * x[j];
}
x[i] = a[i][n + 1] / a[i][i];
}
}
这里再介绍不用小数的高斯消元,也就是使用 __gcd(int x, int y)
函数,我们考虑在计算 $ r $ 的时候可以不使用除法,也就是求出 $ a[j][i] $ 盒 $ a[i][i] $ 的 __gcd
,比较好想,也就是我们平时解方程的思路
代码如下:
# include <bits/stdc++.h>
using namespace std;
int a[500][500];
double x[500];
int n;
inline void gauss () {
for (int i = 1; i <= n; ++ i) {
for (int j = i; j <= n; ++ j) {
if (fabs (a[j][i]) != 0) {
for (int k = 1; k <= n + 1; ++ k) {
swap (a[i][k], a[j][k]);
}
break;
}
}
for (int j = i + 1; j <= n; ++ j) {
if (a[j][i] == 0) continue;
int l = a[j][i] / __gcd (abs (a[j][i]), abs (a[i][i])) * a[i][i]
int ri = l / a[i][i];
int rj = l / a[j][i];
for (int k = 1; k <= n + 1; ++ k) {
a[j][k] = a[j][k] * rj - a[i][k] * ri;
}
}
}
for (int i = n; i >= 1; -- i) {
for (int j = i + 1; j <= n; ++ j) {
a[i][n + 1] -= a[i][j] * x[j];
}
x[i] = 1.0 * a[i][n + 1] / a[i][i];
}
}
signed main () {
cin >> n;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n + 1; ++ j) {
cin >> a[i][j];
}
}
gauss ();
for (int i = 1; i <= n; ++ i) {
printf ("%.2f\n", x[i]);
}
return 0;
}
分块打表
这是高斯消元中最不要脸的应用
适用于的题型:输入一个数,输出一个数
比如说,输入一个数 $ x $,输出一个数 $ y $,我们可以假设 $ x,y $ 的关系是 $ y = kx $,然后试几个 $ x,y $,把 $ k $ 当成未知数做高斯消元
如果发现无解的话,就可以接着尝试两个未知数,比如说 $ y = ax^2 + bx $,然后知道试出规律
实测不好用
三、矩阵进阶
一些性质
单位矩阵:
对于任意单位矩阵 $ I $,有 $ AI = IA = A $
而对于矩阵:
和任意矩阵相乘,会交换矩阵的 $ 2 $ 、 $ 3 $ 行
然后再看:
和一个 $ 2 \times 2 $ 的矩阵相乘,会把第二行加上第一行的 $ x $ 倍
求逆矩阵
逆矩阵:如果 $ AB=I $,称 $ A $ 和 $ B $ 互为逆矩阵
我们考虑做高斯消元,把 $ A $ 消成 $ I $,设 $ A $ 乘上了 $ B $,然后这里我们考虑对 $ I $ 做同样的操作,即 $ IB = B $,然后我们就可以得到逆矩阵
四、事件
随机试验
-
不能预先确知结果
-
试验之前可以预测所有可能结果或范围
-
可以在相同条件下重复实验
样本空间:随机试验所有可能结果组成的集合,一个可能结果叫做样本点
事件发生:在一次试验中,事件的一个样本点发生
样本空间的任意一个子集称之为事件
确定事件
必然事件:样本空间全集
不可能事件:空集
五、概率
定义
一个事件 $ A $ 发生的概率是 $ P(A) $
性质
-
$ 0 \le P(A) \le 1 $
-
所有样本点发生的概率和是 $ 1 $
-
若 $ P(A) = 0 $,那么称其为不可能事件
条件概率
$ P(A|B) $ 表示当事件 $ B $ 发生时事件 $ A $ 发生的概率
例题:$ A = {1,2,3}, B = {1,3,5} $,求 $ P(A|B) $
这样的话我们知道事件 $ B $ 必然发生,所以我们可以在事件 $ A $ 中找事件 $ B $ 中出现过的样本点,即 $ 1,3 $,三个数中的两个,所以 $ P(A|B) = \frac{2}{3} $
计算公式:$ P(A|B) = \frac{P(AB)}{P(B)} $
可以简单理解一下,在事件 $ B $ 发生时 $ A $ 发生,也就是在事件 $ B $ 发生时 $ A,B $ 同时发生,即事件 $ AB $ 发生是事件 $ B $ 的一部分,也就是求 $ P(AB) $ 的概率,也就是上面的公式
我们可以把公式变形:$ P(A|B)P(B) = P(AB) $
独立事件
如果 $ P(A)P(B) = P(AB) $,那么事件 $ A,B $ 称为独立事件
不可能事件、必然事件和任何事件都是独立的
如果事件 $ A,B $ 独立,那么 $ P(B|A) = P(B) $
六、期望
定义
把所有样本点的概率和权值相乘后的结果相加,就是期望
比如投骰子:
共有 $ 6 $ 种情况:$ 1,2,3,4,5,6 $
所以 $ E(x) = 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + 3 \times \frac{1}{6} + 4 \times \frac{1}{6} + 5 \times \frac{1}{6} + 6 \times \frac{1}{6} = 3.5 $
然后我们就可以得出期望
我们有公式:$ E(X) = \sum f(x)P(x) $
性质
-
$ E(x_1 + x_2) = E(x_1) + E(x_2) $
-
$ E(c_1x_1 + c_2x_2 + c_3x_3 + \dots + c_nx_n) = c_1E(x_1) + c_2E(x_2) + c_3E(x_3) + \dots + c_nE(x_n) $
七、例题
例题一
首先我们关注到如果一面朝上是红色的话,共有 $ 3 $ 中情况,那么另一面是黑色的情况有 $ 1 $ 种,所以答案是 $ \frac{1}{3} $
用公式解 $ P(A|B) = \frac{P(AB)}{P(B)} $,我们带入具体情况:
$ P(下黑|上红) = \frac{P(上红下黑)}{P(上红)} = \dfrac{\frac{1}{6}}{\frac{1}{2}} = \frac{1}{3} $
例题二
我们考虑比较概率
第一个人抽中的概率是 $ \frac{1}{n} $
第二个人抽中的概率是 $ \frac{1}{n - 1} \times \frac{n - 1}{n} = \frac{1}{n} $
第三个人抽中的概率是 $ \frac{1}{n - 2} \times \frac{n - 2}{n - 1} \times \frac{n - 1}{n} = \frac{1}{n} $
$ \cdots $
所以公平
(结论:越是你觉得不公平的游戏越公平)
例题三
又是一道关于色盲条件概率的题,比较简单
$ P(抽到男人|抽到色盲) = \frac{P(抽到男色盲)}{P(抽到色盲)} = \dfrac{\frac{51}{5000}}{\frac{49}{4000}} = \frac{204}{245} $
例题四
- 第一问
首先当他用完某一盒的时候,这一盒已经摸了 $ n + 1 $ 次,另一盒摸了 $ n - m $ 次,那么只要将它们排列组合就可以了,这里我们注意到,要让这 $ n $ 次和 $ m $ 次穿插这来,我们可以考虑选择这 $ n $ 个,然后让它们插到 $ m $ 个空里,也就是说一共有 $ n + (n - m) = 2n - m $ 个空,插入 $ n $ 个,方案数是 $ C(2n - m, n) $,为什么插入的不是 $ n + 1 $ 个?因为这第 $ n + 1 $ 个要放在最后,即末尾
然后我们就得出了式子:
右边先取完:$ p^n \times (1 - p)^{n - m} \times C(2n - m, n) \times p = p^{n + 1} \times (1 - p)^{n - m} \times C(2n - m, n) $
左边先取完:$ (1 - p)^{n + 1} \times p^{n - m} \times C(2n - m, n) $
- 第二问
我们只需要把第一问的 $ n + 1 $ 改成 $ n $ 就可以了,然后顺序随机,不用考虑最后一个固定,其他的是一样的:
右边先取完:$ p^{n} \times (1 - p)^{n - m} \times C(2n - m + 1, n) $
左边先取完:$ (1 - p)^{n} \times p^{n - m} \times C(2n - m + 1, n) $
例题五
这里看一道类似的题
一个主持人和你先各选一扇门(两扇门里有羊,一扇有车,你想拿到车)请问你要不要换成另一扇
这里应该换,因为主持人直到那扇有车,他一定不会打开有车的门,所以你换了以后概率变成了 $ \frac{1}{2} $
而嗑药问题换不换都行,因为小泽不知道哪个是毒药,所以换不换概率是一样的
具体的话可以自己枚举所有的样本点去计算概率
例题六
考虑枚举前两次操作到达的点 $ (x, y) $,在第一次操作中,有 $ (1 - p) $ 的概率扔到反面,连续 $ x $ 次扔到反面的概率是 $ (1 - p)^x $,即他走到了 $ (x, 0) $,同理,他走到 $ (0, y) $ 的概率是 $ (1 - p)^y $,再加上他抛两次正面,他走到 $ (x, y) $ 的概率是 $ (1 - p)^x \times p \times (1 - p)^y \times p = (1 - p)^{x + y} \times p^2 $
然后计算他回到原点的概率,也就是说他要抛 $ x $ 次正面,$ y $ 次反面,考虑 $ q^x \times (1 - q)^y $,但是并不正确,因为这样的话把顺序固定死了,所以我们考虑在前面 $ x $ 次正面中插入 $ y $ 个反面,可见这是个组合数问题,所以在总共的 $ x + y $ 个空里面插入 $ y $,也就是 $ C(x + y, y) $,所以他回到原点的概率是 $ q^x \times (1 - q)^y \times C(x + y, y) $
然后同时考虑两种情况:$ \sum_{x=0}^\infty \sum_{y=0}^\infty (1 - p)^{x + y} \times p^2 \times q^x \times (1 - q)^y \times C(x + y, y) $
然后考虑换元,枚举 $ x + y $ 和 $ x $,用 $ x + y - x $ 表示 $ y $:
$ \sum_{t=0}^\infty \sum_{x=0}^t (1 - p)^t \times p^2 \times q^x \times (1 - q)^{t - x} \times C(t, x) $ (这里我们考虑到 $ C(x + y, x) = C(x + y, x) $,所以可以转换,具体自己证明,提示比较公式)
然后我们发现 $ p^2 $ 和枚举的 $ x + y, x $ 都没有关系,所以直接分出去,然后因为 $ (1 - p)^t $ 和 $ x $ 没关系,可以放在枚举的 $ x + y $ 之后,式子也就变成了:
$ p^2 \times \sum_{t=0}^\infty (1 - p)^t \times \sum_{x=0}^t q^x \times (1 - q)^{t - x} \times C(t, x) $
我们考虑到二项式定理的公式:$ (x + y)^n = \sum_{i = 0}^{n}C(n, i)x^{n - i}y^i $,和第二个 $ \sum $ 后面的一坨式子很像,考虑一下关系,式子变成了:
$ p^2 \times \sum_{t=0}^\infty (1 - p)^t \times (q + 1 - q)^t = p^2 \times \sum_{t=0}^\infty (1 - p)^t $
这里我们再考虑一下等比数列的公式:
$ x = a^0 + a^1 + a^2 + \dots + a ^ n $
$ ax = a^1 + a^2 + a^3 + \dots + a^{n + 1} $
$ (1 - a)x = 1 - a^{n + 1} $
$ x = \frac{1 - a^{n + 1}}{1 - a} $
考虑第一个 $ \sum $ 后面是等比数列,我们可以带入公式:
$ p^2 \times \sum_{t=0}^\infty (1 - p)^t = p^2 \times \frac{1 - (1 - p)^\infty}{1 - (1 - p)} $
考虑 $ (1 - p)^\infty $ 无线接近于 $ 0 $,所以我们可以把式子变成 $ p^2 \times \frac{1 - 0}{p} = p $
所以概率是 $ p $
例题七
首先计算安全过桥的概率,$ 100 $ 石头的桥有 $ (\frac{99}{100})^{100} $ 的概率会挂掉,$ 1000 $ 石头的桥有 $ (\frac{999}{1000})^{1000} $ 的概率会挂掉
也就是说,要比较 $ \frac{99}{100} $ 和 $ (\frac{999}{1000})^{10} $ 的大小
这里 $ (\frac{999}{1000})^{10} = \frac{999}{1000} \times \frac{999}{1000} \times \dots \times \frac{999}{1000} $
因为 $ \frac{999}{1000} \times \frac{999}{1000} \times \dots \times \frac{999}{1000} > \frac{999}{1000} \times \frac{998}{999} \times \dots \times \frac{990}{991} $
因为 $ \frac{999}{1000} \times \frac{998}{999} \times \dots \times \frac{990}{991} = \frac{99}{100} $
所以 $ \frac{99}{100} < (\frac{999}{1000})^{10} $
所以走 $ 1000 $ 个石子的桥更安全
例题八
验证 $ A \times B $ 是否 $ = C $
这题好说,我们单纯验证的复杂度是 $ O(n^3) $,比较垃圾,所以我们考虑优化
我们在等式两边同时乘上一个 $ 1 \times n $ 的矩阵 $ D $,然后就是要我们验证 $ ABD = CD $
这里我们会发现,我们可以使用 $ O(n^2) $ 的复杂度,算出 $ BD $ 和 $ CD $ 的值,然后 $ O(n^2) $ 算出 $ A(BD) $,考虑矩阵有结合率,这样做是正确的
这样总复杂度是 $ O(n^2) $