目录
2.计数与概率基础
加法原理:完成一个事情有n种方法 ,第i个方法有ai种方案,则一共有a1 + a2 + ... an种方法
乘法原理:完成一个事情有n个步骤 ,第i个步骤有bi种方案,则一共有b1 * b2 * ... bn种方法
容斥原理:假设一个班有10个学生喜欢a,15个学生喜欢b,20个学生喜欢c,设喜欢a, b, c的学生为集合A, B, C,则班里一共有A + B + C - A∩B - A∩C - B∩C + A∩B∩C
即A∪B∪C = A + B + C - A∩B - A∩C - B∩C + A∩B∩C,对于等式右边集合个数为奇数时,符号为正,偶数时符号为负
有重复元素的全排列:假设有k个元素,第i个元素有ai个,求全排列个数
设全排列个数为x,则有a1! * a2! *....ak! * x = (a1 + a2 + ... an)!, 所以 x = (a1 + a2 + ... an)!/a1! * a2! *....ak!
可重复选择的组合:有n个不同元素, 每个元素都可以多次选择,一共选k个元素,则有多少种方法,例如,n = 3, k =2时,有6种:(1, 1) (1, 2) (1, 3) (2, 2) (2, 3) (3, 3)
设第i个元素选xi遍,则x1 + x2 + ... xn = k, 即(x1 +1) + (x2 + 1) + ... + (xn + 1) = k + n
也就是把k+n个1分成n个部分的方案数,想象k + n个1排成一排,放分割线把他们分成n个部分
则原问题的方法数 x = C(k+n-1, n-1) = C(n+k-1, k)
2.1杨辉三角与二项式定理
对于给定n,如何求出(a + b)n次方中所有项的系数呢?
一个方法是递推,模拟杨辉三角:
for(int i = 0; i <= n; i++)
{
C[i][0] = 1;
for(int j = 1; j <= i; j++)
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
时间复杂度O(n*n)
另一种方法是利用等式1,等式1可以由等式2证明
根据等式1,从Cn0 = 1 开始递推
for(int i = 1; i <= n; i++)
C[i] = C[i-1]*(n-i+1)/i;
2.2数论中的计数问题
约数的个数:给出正整数n,可以求出n的唯一分解式n = p1的a1次方 + p2的a2次方 + ... + pk的ak次方,对于n的任意正约数也只能包含p1, p2等素因子,而不能有新的素因子出现,对于n的任意一个素因子,它在所求的约数中的指数可以是0, 1, 2,...,ai共ai + 1中情况,且不同素因子相互独立,所有可以根据乘法原理,n的正约数个数为:(a1+1) * ( a2 + 1) * ... * (ak + 1)
小于n且于n互素的整数个数:给出正整数n,可以求出n的唯一分解式n = p1的a1次方 + p2的a2次方 + ... + pk的ak次方,求1, 2, .... n中与n互素的个数
根据容斥原理,设答案为x ,则x = n - n/p1-n/p2 - ... n/pk +n/(p1*p2) + n/(p1*p3) + ... n/(pk-1*pk)
小于n且与n互素的整数个数也就是欧拉函数,即等式1,讲等式1化简下得到等式2
1-n中所有数的欧拉phi函数值:
void phi_table(int n, int* phi)
{
for(int i = 2; i <= n; i++) phi[i] = 0;
phi[1] = 1;
for(int i = 2; i <= n; i++)
if(!phi[i]) for(int j = i; j <= n; j +=i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
2.3编码与解码
两个a,一个b和一个c组成的所有串可以按照字典序编号为:
aabc(1), aacb(2), abac(3)...cbaa(12),对于有重复元素的全排列:
设全排列个数为x,则有a1! * a2! *....ak! * x = (a1 + a2 + ... an)!, 所以 x = (a1 + a2 + ... an)!/a1! * a2! *....ak!
设f(x)为全排列,d(caba) = f(cba) + f(caa) + f(b) = 3 + 6 + 1 = 10,比cbba小的排列有10个,2.所以对cbba的编码是11,f(cba)为cba的全排列的个数,
2.4离散概率初步
如果样本空间由有限个等概率的简单事件组成,事件E的概率可以由组合计数的方法得到:P(E)=E/S
一个房间里有23个人,至少有两个的生日不同的概率是多少,简单起见,先不考虑2月29日
P(E) = E/S = (S - E')/S = 1 - P365选23/365的二十三次方
这里概率是实数,次方数到了23,得解决溢出问题,解决方案是边乘边除
double birthday(int n, int m)
{
double ans = 1.0;
for(int i=0;i<m;i++) ans *= (double)(n-i) / n;
return 1 - ans;
}
条件概率:P(A|B) = P(AB) | P(B)当AB独立时,P(AB) = P(A) * P(B)
贝叶斯公式: P(A|B) = P(B|A) * P(A) / P(B)
全概率公式:P(A) = P(A|B1)*P(B1) + P(A|B2) * P(B2) + ... + P(A|Bn)*P(Bn)
3.其他数学
3.1递推
汉诺塔问题和Fibonacci数列
Catalan数 给一个凸n边形,用n-3条不相交的对角线把他分成n-2个三角形,求不同的方法数
设答案为f(n),按照顺序把顶点编号为V1, V2, ... Vn,
以三角形V1VkVn为界,将n边形分成两部分,一部分是k边形,另一部分是n-k+1边形
f(n) = f(2)f(n-1) + f(3)f(n-2) + ... + f(n-1)f(2)
另一种方法是以边V1Vk为界,同样是分成两部分,不过以边为分界线会计算重复,共有n-3条对角线,会被多计算2n-6次,
f(n) = (f(3)f(n-1) + f(4)f(n-2) + ... + f(n-1)f(3))*n / (2n-6)
与方法一的递推式比较 f(n) = f(2)f(n-1) + f(3)f(n-2) + ... + f(n-1)f(2),化简可得
f(n+1) = f(n) + f(n)*(2n - 6) / n + f(n) = ((4n-6)/n) * f(n)
这个数列也被称为Catalan数
3.2数学期望
简单地说,随机变量X的数学期望EX就是所有可能值按照概率加权的和
在解决和数学期望相关的问题时,思路可以是:计算出所有可能取值, 以及对应的概率, 最后加权求和
期望的线性性质:有限个随机变量之和的数学期望等于每个随机变量的数学期望之和。例如,对于两个随机变量X和Y,E(X+Y) = EX + EY
全期望公式:类似全概率公式,把所有情况不重复,不遗漏地分成若干类,每类计算数学期望,然后把这些数学期望按照每类的概率加权求和
3.3连续概率