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;

}

二、高斯消元

推荐先学习加减消元法解二元一次方程

先看看蒲通普通的多元一次方程:

\[\begin{cases} a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n = b_1 \\ a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n = b_2 \\ \dots \\ a_{n,1}x_1 + a_{n,2}x_2 + \dots + a_{n,n}x_n = b_n \\ \end{cases} \]

然后我们使用加减消元法,对于第二个方程,我们令 ② $ - $ ① $ \times \frac{a_{2,1}}{a_{1,1}} $,即可在 ② 中消掉未知数 $ x_1 $,对其他的方程采用同样的操作即可消掉未知数 $ x_1 $,然后我们把第一行的未知数 $ x_1 $ 的系数变成 $ 1 $,令 ① $ \times \frac{1}{a_{1,1}} $

接下来采用同样的方法,把这个方程变成如下形式(采用矩阵表示):

\[\begin{bmatrix} a_{1,1}x_1 & a_{1,2}x_2 & a_{1,3}x_3 & a_{1,4}x_4 & a_{1,5}x_5 & b_1 \\ 0 & a_{2,2}x_2 & a_{2,3}x_3 & a_{2,4}x_4 & a_{2,5}x_5 & b_2 \\ 0 & 0 & a_{3,3}x_3 & a_{3,4}x_4 & a_{3,5}x_5 & b_3 \\ 0 & 0 & 0 & a_{4,4}x_4 & a_{4,5}x_5 & b_4 \\ 0 & 0 & 0 & 0 & a_{5,5}x_5 & b_5 \end{bmatrix} \]

然后我们回来解方程,这也比较简单

我们从最后一行开始解

发现可以解出最后一行

然后把这个未知数的值存下来,带入到上一行,就又可以解出另一个未知数

代码如下:

// 普通高斯消元
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 $,然后知道试出规律

实测不好用

三、矩阵进阶

一些性质

单位矩阵:

\[\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

对于任意单位矩阵 $ I $,有 $ AI = IA = A $

而对于矩阵:

\[\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

和任意矩阵相乘,会交换矩阵的 $ 2 $ 、 $ 3 $ 行

然后再看:

\[\begin{bmatrix} 1 & 0 \\ x & 1 \end{bmatrix} \]

和一个 $ 2 \times 2 $ 的矩阵相乘,会把第二行加上第一行的 $ x $ 倍

求逆矩阵

逆矩阵:如果 $ AB=I $,称 $ A $ 和 $ B $ 互为逆矩阵

我们考虑做高斯消元,把 $ A $ 消成 $ I $,设 $ A $ 乘上了 $ B $,然后这里我们考虑对 $ I $ 做同样的操作,即 $ IB = B $,然后我们就可以得到逆矩阵

四、事件

随机试验

  1. 不能预先确知结果

  2. 试验之前可以预测所有可能结果或范围

  3. 可以在相同条件下重复实验

样本空间:随机试验所有可能结果组成的集合,一个可能结果叫做样本点

事件发生:在一次试验中,事件的一个样本点发生

样本空间的任意一个子集称之为事件

确定事件

必然事件:样本空间全集

不可能事件:空集

五、概率

定义

一个事件 $ A $ 发生的概率是 $ P(A) $

性质

  1. $ 0 \le P(A) \le 1 $

  2. 所有样本点发生的概率和是 $ 1 $

  3. 若 $ 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) $

性质

  1. $ E(x_1 + x_2) = E(x_1) + E(x_2) $

  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) $

七、例题

例题一

image

首先我们关注到如果一面朝上是红色的话,共有 $ 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} $

例题二

image

我们考虑比较概率

第一个人抽中的概率是 $ \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 $

所以公平

(结论:越是你觉得不公平的游戏越公平)

例题三

image

又是一道关于色盲条件概率的题,比较简单

$ P(抽到男人|抽到色盲) = \frac{P(抽到男色盲)}{P(抽到色盲)} = \dfrac{\frac{51}{5000}}{\frac{49}{4000}} = \frac{204}{245} $

例题四

image

  1. 第一问

首先当他用完某一盒的时候,这一盒已经摸了 $ 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) $

  1. 第二问

我们只需要把第一问的 $ 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) $

例题五

image

这里看一道类似的题

一个主持人和你先各选一扇门(两扇门里有羊,一扇有车,你想拿到车)请问你要不要换成另一扇

这里应该换,因为主持人直到那扇有车,他一定不会打开有车的门,所以你换了以后概率变成了 $ \frac{1}{2} $

而嗑药问题换不换都行,因为小泽不知道哪个是毒药,所以换不换概率是一样的

具体的话可以自己枚举所有的样本点去计算概率

例题六

image

考虑枚举前两次操作到达的点 $ (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 $

例题七

image

首先计算安全过桥的概率,$ 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) $

posted @ 2023-05-02 14:33  __Tzf  阅读(20)  评论(0)    收藏  举报