如果说,生命的脚步终有一天被时间的尘埃掩埋.|

OoXiao_QioO

园龄:2年3个月粉丝:15关注:7

五一数学

Day 1

一、矩阵

就是 nm 列的二维数组,用中括号框起来。

例如当 n=2,m=3 时,有一个矩阵 A 如下:

[123456]

矩阵加减

将对应位置的两个元素相加,比较容易理解。

[123456]+[123456]=[24681012]

减法同理。

矩阵乘数

也是比较简单,用所有元素乘上这个数。

[123456]×3=[369121518]

矩阵乘矩阵

定义 Anm 列,Bmk 列。

A=[123456]

B=[123456]

设答案矩阵为 C,那么 C 一定是 nk 列。
具体来看做法:

C1,1=A 矩阵中第 i 行第 1 个数×B 矩阵中第 1 行第 j 个数+A 矩阵中第 i 行第 2 个数×B 矩阵中第 2 行第 j 个数+A 矩阵中第 i 行第 3 个数×B 矩阵中第 3 行第 j 个数 =1×1+2×3+3×5=1+6+15=22

可以有技巧的算:Ci,j=A 中的第 i 行(横向)的每一个数去依次乘上 B 中的每一行的第 j 个数(纵向)的和,说起来比较绕,但是懂得了规律以后会发现十分简单。

这里给出一张图片比较好理解:

咕咕

代码

矩阵乘法:

点击查看代码
struct Matrix
{
int n,m;//n:矩阵行数 m:矩阵列数。
int a[105][105];//矩阵
Matrix ()//构造函数,作用:初始化矩阵为 0。
{
n = m = 0;
memset(a,0,sizeof (a));
}
};
Matrix operator * (const Matrix &a,const Matrix &b)
{
//重载 * 运算,起作用当且仅当是 Matrix 类型。
//&:取地址符,操作的时候是直接修改两个矩阵。
//const:防止运算的时候把运算的矩阵本尊破坏。
//注意类型。
Matrix ans;//返回的答案
int x = a.n,y = b.m;
int i,j,k;
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
//枚举每一个位置。
for(k=1;k<=a.m;k++)
//核心部分
ans.a[i][j] += a.a[i][k] * b.a[k][j];
return ans;
}

Day 2

一、模运算

逆元的定义

我们都知道模运算有分配率,但是只适用于乘法,除法不能运用分配率,要想求出除法的模运算,需要做出一些转化。

我们想要求出 (a÷b)modp,但是硬算是求不出来的,需要做一些转化。

我们需要一个整数 x,使得 a×xa÷b(modp)

Tips:xy(modp) 等同于 xmodp=ymodp

我们就称 xb 的逆元。

求逆元的方法

费马小定理

如果 p 为质数且 1a<pgcd(a,p)=1,那么有 ap11(modp)。两边同时除以 a,得 ap21a(modp)
所以 amodp 的逆元是 ap2,可以用快速幂计算。

欧拉定理

条件:gcd(a,p)=1,如果 gcd(a,p)1,逆元不存在。

此时有 aϕ(p)1(modp)

Tips: ϕ(p) 表示从 1n 中有多少个数与 p 互质。

那么 a 的逆元是 aϕ(p)1

怎么计算?有两种算法。

1.暴力计算,复杂度 O(nlogn).

2.规律:ϕ(n)=n(11p1)(11p2)···(11pt)

点击查看代码
int get_phi(int n)
{
int phi = n;
int i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
phi = phi/i*(i-1);
while(n%i==0)//把质因子噶掉
n = n/i;
}
}
if(n!=1)
phi = phi/n*(n-1);
return phi;
}
如何求出 1n 的逆元?

我们设 k=p÷i,r=pmodi

根据小学学过的 =×+,可以得出 p=k×i+r

转换成 k×i+r0(modp)

r 移到右边,得 k×ir(modp)

两边同时除以 i,得出 kri(modp),也就是 k1i×r

继续移项,得出 1ikr(modp)

C++ 语句为:inv[i] = 1ll*(p-k)%p*inv[r]%p

其中 inv[i]1i

代码:

点击查看代码
#include<bits/stdc++.h>
const int N = 1e6;
typedef long long ll;
using namespace std;
ll inv[N],n,p;//inv 数组表示 1/i。
int main()
{
cin>>n>>p;
inv[1] = 1;
int i;
for(i=2;i<=n;i++)
{
ll k = p/i,r = p%i;
inv[i] = 1ll*(p-k)%p*inv[r]%p;
}
for(i=1;i<=n;i++)
printf("%lld\n",inv[i]);
return 0;
}

exgcd

给定 a,b,c,求任意一组整数解 x,y,满足 ax+by=gcd(a,b)

我们令 d=gcd(a,b),因为 gcd(a,b)=gcd(b,amodb),所以把 bamodb 也写成类似的形式:

bx+(amodb)y=d

想要推出 x,y,考虑把 amodb 拆开,得出:

bx+(aab×b)y=d

把括号拆开,得:

bx+ayab×b×y=d

把带有 a 的凑到一起,带 b 的凑在一起,得:

ay+b(xab×y)=d

此时,我们就发现这个式子与原来的式子一样了。所以:

x=y,y=xab×y

此时递归求出 bx+(amodb)×y=d 的解即可。

终止条件?当 b=0 时,gcd(a,b)=a,所以让 x=1,y=0 即可。

可以用 struct 维护三个元素 x,y,gcd,也可以顺便求出 gcd(a,b) 了。

代码:

点击查看代码
struct pi
{
int x,y,d;
pii(int _x=0,int _y=0,int _d=0):x(_x),y(_y),d(_d){}
};
pi exgcd(int a,int b)
{
if(!b)
return {1,0,a};
pi GCD = exgcd(b,a%b);
return {GCD.y,GCD.x-a/b*GCD.y,GCD.d};
}

裴蜀定理

现在有一个问题:x,y,a,b 都是整数,那么 ax+by最小正整数,这说明了,只有答案是 gcd(a,b) 的倍数时,方程才有解,这就是裴蜀定理。

现在要求 ax+by=c,满足 cgcd(a,b) 的倍数,怎么做?

  • 把得到的 x,y 同时乘 cgcd(a,b) 即可。

现在虽然求出了一组解,但是想要求出通解改怎么办?

  • x0,y0 是一开始 exgcd 求出的一组解,那么通解可以写成 x=x0+k×bgcd(a,b),y=y0k×agcd(a,b 的形式,其中 k 是任意整数。

例题 1 - 同余方程

洛谷 P1082

既然这道题有解,那么 gcd(a,b)=1

  • 做法一:可以发现 xa 的逆元。因为 b 不一定是质数,所以用欧拉定理解即可。

  • 做法二:改写一下他的形式。既然 axmodb=1,那么 ax 一定可以写成 by+1 的形式,把他移项,变成 axby=1,那么直接 exgcd 即可。

但是题目要求得是最小正整数解,考虑通项公式。容易发现 xx0(modb)

由于 gcd(a,b)=1,所以 xx0(modb),容易发现答案就是 x0modb,所以 (...%mod+mod)%mod 即可。

二、素数 & 质数

判断一个数是否是质数

如何判断一个数为质数?可以从 1 暴力枚举到 n,判断 n%i==0 即可。注意最大因子不会超过 n,所以可以从 1 枚举到 n,复杂度 O(n)

代码:

点击查看代码
bool is_prime(int n)
{
if(n<=1)
return 0;
if(n==2)
return 1;
if(n%2==0)
return 0;
int i;
for(i=3;i*i<=n;i++)//不要用 sqrt(n),复杂度爆表。
{
if(n%i==0)
return 0;
}
return 1;
}

但如果 n 加强到 1018,上述方法就通过不了,此时需要优化。

运用 Miller_Rabin 进行素性测试。

素数往往满足一下两条定理的至少一条

如果 n 是质数,那么有 n1=d×2r,存在一个 a<n,那么

  • admodn=1

  • 如果 0i<r,那么有 ad×2imodn=n1

但是有些合数往往也满足上述定理之一,我们就要随机取一些 a,增加素数成功的概率。

Tips:上述定理中,素数可能会满足一条或者两条,但一定会满足一条,但是有些合数可能不会满足,也可能会满足一条或者两条,需要进一步排查。如果满足了两条,成为素数的概率不会大于满足一条的概率。

质数筛

  • 埃氏筛
点击查看代码
const int N = 1e6;
int not_prime[N],prime[N];
int cnt;
void make_era()
{
int i,j;
for(i=2;i<=n;i++)
if(not_prime[i])
for(j=i*2;j<=n;j+=i)
not_prime[i]=1;
for(i=1;i<=n;i++)
if(!not_prime[i])
prime[++cnt]=i;
}

复杂度大约为 O(loglogN)

  • 欧拉筛
点击查看代码
const int N = 1e6;
int not_prime[N],prime[N];
int cnt;
void make_ola()
{
int i,j;
for(i=2;i<=n;i++)
{
if(!not_prime[i])
prime[++cnt] = i;
for(j=1;j<=cnt;j++)
{
int x = prime[j]*i;
if(x>n)
break;
not_prime[x]=1;
if(i%prime[j]==0)
break;
}
}
}

复杂度为 O(N)

Day 3

一、BSGS 算法

有一个式子,axb(modp),给定 a,b,p,求 x

暴力

我们可以知道循环节长度为 p1。这是因为费马小定理中,p 是质数,时间复杂度为 O(p)

点击查看代码
int baoli (int a, int b, int p)
{
ll v = 1;
int x;
for(x=0;x<p-1;x++)
{
if(v==b)
return x;
else
v = 1ll*v*a%p;
}
return -1;
}

正解

因为循环节为 p1,所以只需要枚举前 p1 个数。

将这 n 个数分组,设每组 s 个数,我们可以得出许多组,像下面一样。

1.{a0,a1,...,as1}

2.{as,as+1,...,a2s1}

我们就可以从第一组查找满足条件的 b,如果没有找到,就从第二组找……这还是一种暴力的思想。

我们将两组联系起来,发现第二组每一个数都是第一组的 as 倍,将第二组的每个数处以 as,就得出了第一组。

如果第二组存在 b,那么第一组一定存在 bas

如果第 i 组出现 b,那么第一组一定存在 bas(i1)

可以运用哈希或者二分查找。

代码:

点击查看代码
set<ll> se;
int BSGS(int a,int b,int p)
{
int s = sqrt(p);
ll v = 1;
int i,j;
for(i=0;i<s;i++)
{
se.insert(v);
v = 1ll*v*a%p;
}
for(i=0;i*s<=p;i++)//看看答案是否在第 i 行里面
{
//要看 b*a^(-is) 是否在第零行出现
ll c = 1ll*b*ksm(ksm(a,i*s,p),p-2,p);
if(se.count(c)!=0)
{
ll v = ksm(a,i*s,p);
for(j=i*s;;j++)
{
if(v==b)
return j;
v = 1ll*v*a%p;
}
}
}
return -1;
}

懒人最爱的 set!!
复杂度为 O(plogp)

二、排列组合

排列

三个人中选两个人站成一排,考虑顺序。

6 种情况:

1.{1,2}
2.{1,3}
3.{2,1}
4.{2,3}
5.{3,1}
6.{3,2}

公式:

P(n,m)=n(n1)(n2)···(nm+1)=n!(nm)!

组合

三个人中选两个人站成一排,考虑顺序。

3 种情况:

1.{1,2}
2.{1,3}
3.{2,3}

公式:

C(n,m)=Cnm=n(n1)(n2)···(nm+1)m!=P(n,m)m!=n!m!(nm)!

组合数有以下性质:

  • C(n,n)=C(n,0)=1
    显然 n 个数中选 n 个数的方案为 1
  • C(n,m)=C(n,nm)
    m 个数也等于不选 nm 个,当然推式子也可以算出。
  • i=0nC(n,i)=2n
    0n 个物品中有两种选择:选或不选,所以为 2n
  • C(n,m)=C(n1,m1)+C(n1,m)

详细讲一下第四个式子。

考虑第一个数选或不选,即两种可能。

如果选择了,那么要从剩下的 (n1) 个中选 (m1) 个;

如果没有选择,那么要从剩下的 (n1) 个中选 m 个,加起来就是 n 个中选 m 个,即 C(n,m)

这里给出递推式代码:

点击查看代码
int C[1001][1001];
ll p;
void make_C(int n,int m)//用递推式做
{
int i,j;
for(i=0;i<=n;i++)
{
C[i][0] = 1;
for(j=1;j<=i;j++)
C[i][j] = (C[i-1][j-1]+C[i-1][j])%p;
}
return;
}

转化成图像怎么解释呢?通过画图,得出是一个杨辉三角。

image

  • n1 时,有 C(n,0)C(n,1)+C(n,2)C(n,3)+···=0

  • C(n,m) 展开 k 次,得:

C(n,m)=C(k,0)C(nk,mk)+C(k,1)C(nk,mk+1)+C(k,2)C(nk,mk+2)+C(k,3)C(nk,mk+3)++C(k,k)C(nk,mk+k)=i=0kC(k,i)C(nk,mk+i)=i=0kC(k,i)C(nk,mi)

例题 1

1nn 个数,每个数可以选很多次,从中选出 m 个数,不计顺序,求方案数。

先考虑只能选一次的情况。将这些书排序,其实就是求不等式 1a1<a2<...<amn 的解的数量。答案为 C(n,m)

那么如何把 干掉呢?令 bi=ai+i1,那么原式就变成了 1b1<b2<...<bmn+m1。此时的解为 C(nm+1,m),把 bi 还原成 ai,所以本题的答案就是 C(n+m1,m)

例题 2

给出 n,m,p,求 C(n,m)modp,其中 1n,m,p1018

用分类讨论思想解决。

  • 一、如果 n,m1018,p=1,答案是 0

  • 二、如果 n,m1000,p109,那么可以用递推式来算。

  • 三、如果 n,m106p 是质数,那么怎么做呢?

用逆元+阶乘解决。

C(n,m)modp=n!m!(nm!)modp=n!(m!)p1(nm)!p2modp

给出代码:

点击查看代码
int fac[1000001];
int find_C(int n,int m,int p)
{
fac[0] = 1;
int i;
for(i=1;i<=1000000;i++)
fac[i] = 1ll*fac[i-1]*i%p;
return 1ll*fac[n]*ksm(fac[m],p-2,p)%p*ksm(fac[n-m],p-2,p)%p;
}
  • 四、如果 n109m103p109

m 挺小的,所以突破口就在 m 上。猜测一下复杂度约为 O(m2)

我们进行约分,得:

C(n,m)=i=0m1nim!

Tips:i=1nC++ 中表示为:for(i=1;i<=n;i++) sum *= i

把乘法拆开,分子与分母的项数都为 m 左右。

因为答案是整数,所以把分子与分母约分,直到分母全部为 1 为止。把分子乘起来就是答案。约分要用到 gcd,所以复杂度为 O(m2logn)

点击查看代码
int fenmu[10001],fenzi[10001];
int find_C(int n,int m,int p)
{
int i,j;
for(i=1;i<=m;i++)
fenmu[i] = i,fenzi[i] = n-i+1;
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
int g = gcd(fenzi[i],fenmu[j]);
fenzi[i] /= g;
fenmu[j] /= g;
}
}
int ans = 1;
for(i=1;i<=m;i++)
ans = 1ll*ans*fenzi[i]%p;
return ans;
}
  • 五、如果 n,m109p100 且是质数。

Lucas 定理做。

Lucas 定理的定义:

C(n,m)C(np,mp)×C(nmodp,mmodp)(modp)

解释成人话就是:将 n,m 转换成 p 进制数,C(n,m)modp 等于 n,mp 进制下的各位相乘。

n 拆成 p 进制位 n1,n2,···,nkm 拆成 m1,m2,···,mk,那么 C(n,m)modp=i=1kC(ni,mi)

其中 nimi 都是一位数字。

通过发现 p 比较小,所以 C(nmodp,mmodp) 可以直接 O(p2) 推出来,剩下的继续递归。

终止条件:m=0 时,返回 1

举个例子:当 n=221,m=110(三进制),p=3

那么有

C(n,m)=(2,1)×C(2,1)×(1,0)(modp)

此时的做法为:暴力预处理出组合数,然后用短除法将 n,m 分解成 p 进制,然后诸位计算即可。

复杂度 O(p2+logpn)

代码;

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int c[101][101];
int x[10001];
int y[10001];
int Lucas(int n,int m,int p)
{
//n,m<=10^9
//p <=100 且是质数
int i;
while(n!=0)
{
x[0]++;
x[x[0]] = n%p;
n /= p;
}
while(m!=0)
{
y[0]++;
y[y[0]] = m%p;
m /= p;
}
//x[1] x[2]....x[x[0]] 是 n 的 p 进制从低到高的表示
//y[1] y[2]....y[y[0]] 是 m 的 p 进制从低到高的表示
int ans = 1;
for(i=1;i<=x[0];i++)
ans = 1ll*ans*c[x[i]][y[i]]%p;
return ans%p;
}
signed main()
{
int n,m,p;
scanf("%d%d%d",&n,&m,&p);
int i,j;
for(i=0;i<=p;i++)
{
c[i][0] = 1;
for(j=1;j<=i;j++)
c[i][j] = (c[i-1][j-1]+c[i-1][j])%p;
}
printf("%d\n",Lucas(n,m,p));
return 0;
}

如果要求 C(n,m)mod30,怎么办?

30 质因数分解,30=2×3×5,分别计算 C(n,m)mod2,3,5 的结果,分别设为 x1,x2,x3,那么有

{C(n,m)x1(mod2)C(n,m)x2(mod3)C(n,m)x3(mod5)

直接 CRT 即可。

例题 3

洛谷 P4369
给你两个数 nk,请给出 k不同的组合数,使得它们的和相加为 n

所谓不同,即对于 C(n1,m2)C(n2,m2) 的组合数,n1n2
m2m2,那么就称这两个组合数是不同的。

诈骗题。

众所周知,一个正整数 n 可以拆成 n1 相加,既然要求 k 个组合数,那我们就让前 (k1) 个组合数为 1,最后一个为 nk+1,就可以让和为 n 了。

那么前 (k1) 个组合数是什么呢?我们知道 C(n,0)=1,那就让这些组合数的 “n” 都为 i,这样就可以通过了。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int i;
for(i=1;i<k;i++)
printf("%d 0\n",i);
printf("%d 1\n",k);
return 0;
}

例题 4

给出 n1,m1,n2,m2,比较 C(n1,m2)C(n2,m2) 的大小。

首先来讲一下 log

如果 xy=z,那么 logxz=y

log(a×b)=loga+logblog(a÷b)=logalogb

Tips:这里的 log 都是同底的,同底不影响大小。

如果 loga<logb,那么 a<b

根据上述式子,可以算出 logC(n,m)

首先 C(n,m)=n!m!(nm)!

所以 logC(n,m)=logn!logm!log(nm)!

然后就可以计算了。想要求出 log 的阶乘,可以从 logi=logi1+logi 考虑,用递推算即可。

点击查看代码
int faclog[1000001];
double logger(int n,int m)
{
faclog[0] = 0;
int i;
for(i=1;i<=100000;i++)
faclog[i] = faclog[i-1]+log(i);
return faclog[n]-faclog[m]-faclog[n-m];//比较 log(C(n1,m1)) 和 log(C(n2,m2))
}

例题 5

洛谷 P4370

给出 n,k,让你找到 k 个不同的组合数,使得这 k 个组合数的和最大。要求这些组合数 C(a,b) 满足 0ban,求出这个最大的和。n106,k105

先把杨辉三角搞出来:

image

我们发现在三角中,最后一行的中间往往比较大,我们就可以考虑从中间优先选择。

那么第二大的数呢?肯定实在最大的上下左右。我们可以比较一下那个数更大。

可以向四周扩充几个点,维护一个候选集,从里面挑一个最大的,并且重新更新,重复 k 次即可。

就是一个裸的 BFS

例题 6

咕咕

三、抽屉原理

定义:(n+1) 个物品放入 n 个抽屉里,至少有一个抽屉有多余 1 个物品。

推广:把 (kn+1) 个物品放在 n 个抽屉里,必然有一个抽屉有 (k+1) 个物品。

例题 1

给定 n 个数,随便选择任意个数,使得它们的和是 c 的倍数,任意给出一组解。cn105

引入前缀和。

sumi=a1+a2+···+ai

如何求出 lr 的和?是 al+···+ar,即 sumrsuml1

有了前缀和后,该怎么解题呢?

发现前缀和是连续的一段和,那我们就让题目复杂一点,即必须选连续的一些数。

把每个前缀和对 c 取模,如果 sumimodc=0,那么这一段就是答案,否则放到 (c1) 个抽屉里面,那么肯定有两个前缀和放在一个抽屉里面,那么多出来的和就一定是 c 的倍数。

例题 2

洛谷 P2218
平面上有 n 个点,每个点有坐标 (xi,yi),用 3k×k 的正方形覆盖所有点(平行于坐标轴),求最小的 k1n5×104

我们先随便定一个 k,例如 k=100

假设现在已经覆盖住了所有点,那么 k=150 的时候,可以覆盖住吗?或者 k=50 的时候,可以全部覆盖吗?

答案分别是可以、不可以。

我们可以先找到边缘的四个点,即左、右、上、下。然后画一个大正方形,根据抽屉原理,一定会有一个正方形盖住两个点,所以这两个点就会成为正方形的顶点。

于是我们可以暴力枚举盖住哪个角,暴力枚举三次,最后检验一下每个点是否都被覆盖即可。

四、容斥原理

定义:有 A1 个学语文的人,A2 个学语文的人。

那么 A1A2 表示同时学语文数学的人, A1A2 表示学语文学数学的人。

可以得出 |A1A2|=|A1|+|A2||A1A2|

画个图好理解:咕咕。

此时又出现了学英语的人,A3

|A1A2A3|=|A1|+|A2|+|A3||A1A2||A1A3||A2A3|+|A1A2A3|

此时又双叒叕出现了打游戏的人,A4

可以根据上面的式子的出来,但是比较复杂,懒得列出来了()

骗你的我这么勤奋,当然会列出来呢。

快给我点赞点赞点赞!!

|A1A2A3A4|=|A1|+|A2|+|A3|+|A4||A1A2||A1A3||A1A4||A2A3||A2A3||A3A4|+|A1A2A3|+|A1A2A4|+|A1A3A4|+|A2A3A4||A1A2A3A4|

可以总结出 n 个种类的人时,容斥原理的公式。

B{A1,A2,···,An}(1)|B|+1|AiBAi|

例题 1 - N 对夫妻问题

奇怪的名字。

n 对夫妻,一共 2n 个人。把他们排成一,满足每对夫妻都不相邻且旋转后相同的方案算一种,求方案数。

先考虑随坐的方案数,为 (2n1)!

我们先强制让一对夫妻相邻,即 (2n1)!C(n,1)

把那一对夫妻绑在一起,看成一个人,此时就剩下了 (2n1) 个人,方案数为 (2n2)!×C(n,1)

但是我们可以把一夫一妻调换位置,所以要 ×2

整理一下,让一对夫妻相邻的方案数为 (2n1)!C(n,1)×(2n2)!×2

此时算完了吗?并没有,因为有算重的情况。

例题 2

给出 n,询问 1n 中有多少个数可以表示成 xy,y>1 的形式。1n1018

Day 4

一、解 方 程

是的你没看错,这一章讲的就是解方程。

二元一次方程

先给出一组二元一次方程:

{x1+5x2=13(1 式)3x2+x1=9(2 式)

1 式减去 2 式,得 2x2=4,可以算出 x2=2,随便带入一个式子,得 x1=3

多元一次方程

以此类推,可以算出三元、四元等方程组中。

给出一个多元一次方程组:

{a1,1x1+a1,2x2++a1,nxn=b1a2,1x1+a2,2x2++a2,nxn=b2an,1x1+an,2x2++an,nxn=bn

怎么解呢?可以用高斯消元来解决。

高斯消元的基本逻辑:每一次消掉一个未知数,减少一个方程,最后得到一个一元一次方程来求解的方法。

先给一个例子:

{x+y+4z=195x+2y=252y+3z=19

把他们对齐,并补齐系数(没有字母则为 0)。

成为:

{1x+1y+4z=195x+3y+0z=250x+2y+3z=19

可以抽象看成一个矩阵乘法:

[114530023]×[xyz]=[192519]

把等式的右边提到左边,得:

[114195302502319]

接下来开始高斯消元:

先把第一行同时乘上一个数,此时第二行的每个元素都加上第一行的对应的数乘上这个倍数。

这个倍数该怎么选择呢?通常情况下,第二行第一列的这个数,需要加上第一行第一列的数乘上这个倍数,使得第二行第一列的数为 0

我们来进行第一次高斯消元:

[1141902207002319]

可以看到如果倍数选了 5,此时第二行第一列的数为 5+(5)×1=0,第二行第二列的数为 3+(5)×1=2,第二行第三列的数为 0+(5)×4=20,第二行第四列的数为 25+(5)×19=70

留坑待补。

二、扩展矩阵

如果有两个 n×n 的矩阵,他们两个相乘,为 C 矩阵,如果 C 矩阵的对角线为 1,其他数为 0,那么就称 C 矩阵为单位矩阵。

AB=C=[1000001000001000001000001]

我们就把 AB 互相称为逆矩阵。

BA 的逆矩阵,A 也是 B 的逆矩阵。

AB 有以下性质:

  • AB=BA=In

留坑待补。

三、概率

引入一个例子:扔一个骰子,每一面朝上的概率为多少呢?

因为骰子有 6 个面,每个面上都有一个数字,所以这些概率相等,都为 16

1,2,3,4,5,6 这几个数称为样本空间,其中任意一个数称为样本点。事件是这些样本点的集合,即样本点相加为事件。

先来熟悉一下集合:

两个集合,A={1,2,3},B={2,3,4}

AB=AB={2,3},即 AB 共有的部分。

AB=A+B={1,2,3,4},即 AB 中出现过的数。

AB=AAB={1},即在 AB 没有出现过的数。

P(A) 称为事件 A 发生的概率。注意每个样本点的概率不一定相等,一个事件的概率就是事件内样本点的概率的和。

概率有一些性质:

  • 0P(A)1

  • 假设样本空间有 n 个样本点,B1,B2,...,Bn,那么 i=1nP(Bi)=1

  • 如果 P(A)=1,那么把 A 称为必然事件;若 P(A)=0,称 A 为不可能事件。

P(A|B) 称为在 B 发生的情况下,发生 A 的概率,这就是条件概率。

举个例子:当 P(扔到 1|扔出的点数在 1 到 3 之间)=13

A={1,2,3},B={1,2,5},P(A|B)=23。就是 3 个中满足 2 个概率的条件。

条件概率有一个简单的公式:

P(A|B)=P(AB)P(B)

给一张图片加以解释:

image

如果 B 发生了,就是红色的部分,如果 A 同时发生,就是蓝色部分。所以就可以得出了上述公式。

同时乘上 P(B),也可以得出 P(A|B)P(B)=P(AB)

如果 A 事件发生,而 B 事件不发生,那么把这两个事件称为独立事件。

AB 是独立事件,那么:

P(A)P(B)=P(AB)

与条件概率相结合,可以得出:

P(A)P(B)=P(A|B)P(B)=P(AB)

那么

P(A)=P(A|B)

四、期望

继续扔骰子,扔到每个数的概率为 16,求每个数的期望。

啥是期望?也就是每个事件的权值 × 事件的概率并求和,那么扔骰子的概率为:

(1+2+3+4+5+6)×16=72

那么求扔出的数的平方的期望呢?

为:

(a2+22+32+42+52+62)×16=916

期望也有一些性质:

  • 期望的和 = 和的期望。例如有两个骰子:一个是正常的,每个数的概率都是 16;第二个骰子被 TZF 施了魔法,扔出 6 的概率是 95100,其他 5 个数字都是 1100,那么有:

E(x1+x2)=E(x1)+E(x2)

换成平方也可以:

E(x2+x12)=E(x1)+E(x22)

例题 1

3 张形状相同的卡片,一张两面都是黑色,一张两面都是红色,一张一面红一面黑。随机取出一张放在桌子上,朝上的为红色,那么另一面为黑色的概率是多少?

根据条件概率的计算,可得:

P(下黑|上红)=下黑 × 上红P(上红)=1636=13

例题 2

n 个人按照一个顺序依次抓阄,每个人抓到了以后立即打开,当有人抓中后,游戏结束(只有一个“中”)。问游戏是否公平,并说明理由。

公平。理由如下:

第一个人抽到的概率为 1n

第二个人抽到的概率为 n1n1n1=1n

第三个人抽到的概率为 n1nn2n11n2=1n

以此类推,可以得出概率都是 1n,所以公平。

例题 3

设男女人口比例为 51:49,男人色盲概率为 2%,女人色盲的概率为 0.25%,现随机抽到了一个人为色盲,请问该人为男人的概率是多少。

条件概率式子为:

P(|)=P(男人 × 色盲)P()=51%2%51%2%+49%0.25%

懒得算了。

例题 4

一个人左右口袋里面各有一盒火柴,每盒 n 支。每次抽烟时随机选一盒拿出一只并用掉,由于习惯原因,选右面口袋的概率是 p>12。问:下述两种概率是否相等?并求出概率的值。

  • 到某次他发现取出的这一盒已经空了,这时另一盒剩下 m 支。

  • 他用完某一盒时,另一盒恰好有 m 支火柴。

我们可以列出左口袋与有口袋摸的概率:左边为 1p,右边为 p

如果有 n 个火柴,发现取完了以后,此时取了 (n+1) 次。

留坑待补。

例题 5

小葱和小泽面前有三瓶药,其中两瓶是毒药,一瓶是果汁,每个人必须喝一瓶。

小葱和小泽各自选择了一瓶药,小泽手速比较快,把药喝了下去,然后就挂掉了。

小葱想要活下去,他看到手上的药陷入了沉思——他应该喝掉手上的这一瓶还是换成剩下的一瓶呢?

两个人选择的药一共有 6 种情况,运用条件概率可以得出以下式子:

P(|)=P(×)P()=2646=12

所以换或者不换,无所谓。

例题 6

上一个问题的扩展——“三门问题”。

三个门,一个里面有车,剩下的两个有 mie~mie~ 叫的羊,现在你选择了一个门,主持人知道哪个门有车、哪个门有羊。

留坑待补。

例题 7

小葱想要过河,过河有两条路:

  • 一条路有 100 个石头,每个石头有 1100 的概率会挂掉。

  • 一条路有 1000 个石头,每个石头有 11000 的概率会挂掉。

小葱应该走哪条路呢?

这个问题相对比较简单。

第一条路存活的概率:(99100)100

第二条路存活的概率:(11000)1000

可以用计算器计算。

那么如果在数学考试中,不让用计算器呢?那该怎么做呢?

先把指数约分一部分,就成为了: 99100(9991000)10

我们都知道 9991000>988999>997998>...>23>12

所以 (9991000)10>9991000×...×990991=99100

所以 (9991000)1000>(99100)100

所以答案是不过河走第二条路。

例题 8

小胡站在原点,手里拿着两枚硬币。抛第一枚硬币正面向上的概率为 q,第二枚正面向上的概率为 r

  • 阶段一:小胡开始抛第一枚硬币,每次抛到反面小胡就向 y 轴正方向走一步,直到抛到正面。
  • 阶段二:接下来小胡继续抛第一枚硬币,每次抛到反面小胡就向 z 轴正方向走一步,直到抛到正面。
  • 阶段三:现在小胡想回来了,于是他开始抛第二枚硬币,如果小胡抛到正面小胡就向 y 轴的负方向走一步,否则小胡就向 z 轴的负方向走一步。
    现在小胡想知道他在往回走的时候经过原点的概率是多少呢?

分析:留坑待补。

式子:

x=0y=0(1p)xp(1p)ypqx(1q)yC(x+y,x)=x=0y=0p2(1p)x+yqx(qp)yC(x+y,x)=t=0x=0tp2(1p)tqx(1q)txC(t,x)t=x+y=p2t=0x=0t(1p)tqx(1q)txC(t,x)=p2t=0(1p)t(q+1q)t=p2t=0(1p)t=p21(1p)+11(1p)=p21p=p

其他

鸣谢

由于本人对关于膜运算的掌握较差,于是大部分参考的是 SYZ 大佬的博客

同时在更好的讲解时,参照了 TZF 大佬的博客ZHZ 大佬的博客

同时感谢 QZH 大佬的博客给了这篇博客创作的动力(QZH 大佬写了 1000 多行/bx/bx/bx)。

还有 CZH 大佬的支持 %%%%%%%%%%%%%%%。

彩蛋

posted @   OoXiao_QioO  阅读(281)  评论(3编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起