概率相关知识点
1、P(X=K)=P(X>=K)−P(X>K)
2、E[x]=∑1∞P(X≥i)
3、P(A)=P,则一直随机直到发生事件A的期望次数为P1
每次随机一个[1…n]的数,期望随机几次能随机出全部的数
- Ti:当前有i个数,第一次随机到新的数
- E[x]=∑0n−1E[Ti]
- P(Ti)=nn−i
- E[Ti]=P(Ti)1=n−in
- E[x]=∑0n−1n−in=∑1nin
随机一个长度为n的序列p,p[i]是p[1..i]中最大的概率
- 设随机变量xj,当p[j]是p[1..i]中最大值时为1,否则为0
- 则∑1iXj=1
- 因为随机序列,则E(X1)=E(X2)=E(X3)=...
- E(Xi)=i1
随机游走:
一个n个点的完全图,求从s走到t的期望时间
- 从一个点走到任意另一个点的概率:n−11,则次数的期望为n−1
一条长度为n的链,从一端走到另一端的期望时间
- Xi:第一次走到i到第一次走到i+1用的次数
- E(x)=∑0n−1E(Xi)
- E(Xi)=21+21(1+E(Xi−1)+E(Xi)(21概率直接从i走到i+1,21的概率从i走到i−1,此时期望为一次加i−1走到i的期望和i走到i+1的期望
- 由上式可得E(Xi)=2+E(Xi−1)
给定n个硬币,第i个硬币的价值是wi,每次随机取走一个硬币,获得收益是左右两个硬币的价值的乘积,求期望总价值
- Xij:第i个硬币和第j个硬币相邻的期望
- E(x)=∑ijwi∗wj∗E(Xij)
- E(Xij)为从i到j中取硬币,全部取完且最后两个是ij的概率,所以是i到j所有数-2的全排列除以i到j所有数的全排列乘以2
- E(Xij)=(j−i+1)!2∗(j−i−1)!=(j−i+1)∗(j−i)2
线性性与等价性的应用
随机一个1...n的排列p,p[i]是p[1...n]中前k大的概率
- xi为1则p[i]为前k大,否则为0
- E(x)=∑E(xi)=k
- E(xi)=nk
给定一棵n个点的有根树,一开始每个点都是白色, 每次等概率随机选择一个白点,将整个子树都染成黑色,问期望随机几次能把整棵树染黑
- 设Xi,当i被选中的时候为1,否则为0,则E(X)=∑1nE(Xi)
- 对于E(Xi),由于i点和其祖先节点在不被选中的时候其他点可以任意选择,故仅需考虑i点和其祖先节点
- 仅考虑i点和其祖先节点时(共有x个祖先节点),需要i点第一个被选中,则概率为x+11
- 则E(Xi)=depi+11
有n堆石头,每堆个数为a[i],现在每次等概率随机选一个石头,然后将那个石头所在的那堆石头全扔了,直到第一堆石头被扔掉,问期望扔几次
- 设xi,当i被扔的时候为1,否则为0,E(x)=∑1nE(xi)
- 对于E(xi),第i堆被扔当且仅当第1堆在第i堆之后扔
- 故E(xi)=a1+aiai
对于一个1…n的排列p,定义他的价值为:所有满足p[i]>max(p[i−1],p[i+1])的i的和。现在随机一个排列p,求价值的期望
-
设xi,当p[i]>max(p[i−1],p[i+1])时为i,否则为0,E(x)=∑1nE(xi)
-
当i=1 or i=n时,p[i]满足条件的概率为21,则期望分别为E(x1)=21和E(xn)=2n
-
当1<i<n时,考虑相邻三个数p[i−1],p[i],p[i+1],p[i]为三个数中最大的数的概率为31,所以E(xi)=3i
等概率随机一个长度为n的01串,定义01串的价值为:所有全1连续子串的长度的平方和,求价值的期望
- 对于一个含有全1子串长度为len1,len2,...,lenk的01串,X=∑leni2
- 对于一个长度为n的全1串,其包含子串个数为2n(n+1)=21(n2+n)
- 将以上问题转化为对01串全部子区间的和问题,则X=∑每个区间是否全1
- 设xij,当区间i...j中全部为1时,xij=1,否则为0
- 对于一个长度为n的全1子串,由于其子串数量为21(n2+n)。所以对于一个全1串来说会被统计21(n2+n)次,则此时对于这个全1串来说,他的权值是21(n2+n)
- 题目求的价值为所有全1连续子串的长度的平方和,所以对上述每一个全1串权值进行变换即可得到最终答案
- 设第i个全1子串的价值为Xi,则该子串的在当前问题下的实际价值为2∗Xi−n
- 则X=2∗∑i≤jxij−∑i=1nxii
- 则E(X)=2∗∑i≤jE(xij)−∑i=1nE(xii)
- E(xij)=(21)j−i+1,E(xii)=21,带入求和即可
上面题的另一个版本做法(可能会较上一个版本难理解):
- 设两个随机变量Xi,Yi。Xi表示的是在添加第i+1个字符的时候答案的增量,Yi表示的是前i个字符后缀1的长度。
- 当末尾添加字符为1时,Xi=(E(Yi)+1)2−E(Yi)2=2E(Yi)+1。当末尾添加字符为0时,Xi=0
- 当末尾添加字符为1时,Yi=Yi−1+1,当末尾添加字符为0时,Yi=0
- 则E(Xi)=21∗0+21(2E(Yi)+1),E(Yi)=21∗0+21(E(Yi−1)+1)
- 由于Xi表示的是答案的增量,故答案X=∑0n−1E(Xi)
等概率随机一个排列p[1...n],定义f(p)为有多少个i满足p[i]是p[1...i]的最大值,求f(p),f(p)2的期望
- 设xi,p[i]为p[1...i]最大值时为1,否则为0
- 设X=f(p),则E(X)=∑1nE(xi)=∑1ni1
- X2=(∑1nxi)2=∑i=jxixj+∑1nxi2,其中xi={10,故xi2=xi,则原式=∑i=jxixj+∑1nxi
- 由上式可得E(X2)=∑i=jE(xixj)+∑1nE(xi)
- 考虑i<j时,p[j]是p[1...j]的最大值的概率为j1,则去掉p[j]后,前j−1个数字是完全随机的,则p[i]是p[1...i]中最大的数的概率为i1,则p[j]是p[1...j]的最大值且p[i]是p[1...i]的最大值的概率为ij1,则E(xixj)=P(xixj)=ij1
- 综上E(X2)=∑i=jij1+∑i=1ni1
给定一个字符串T,和一个字符串序列S[1…n]
选择k次来构造一个字符串,每次随机从S[1…n]中随机选一个字符串拼接到已构造的串后面
求T在构造的串中的期望出现次数
∣T∣≤50,n≤50,∣S[i]∣<=50,k<=1012
- 首先考虑k≤50的情况。此时可以通过dp暴力算出答案
- 令dp[i][j]表示加入第i个串后kmp指针指在j时的状态
- 对于每个i,j,枚举每个字符串,算出当前i个字符串kmp指针指在j时,加入字符串s[i]后T出现的次数x,以及kmp指针指向的位置j′,得到转移方程dp[i+1][j′]=dp[i][j]+x。最后枚举dp[k][j],算出所有情况的出现次数除以k!即可。
- 再考虑k>50的情况。考虑极限情况,当加入一个新的字符串的时候,T的出现次数最多会与前50个串有关系(s[i]=1的时候)
- 令f[k]表示拼接k次后的期望次数,则可以推出结论当k>∣T∣时有f[k+1]−f[k]=f[k+2]−f[k+1],即k>∣T∣时期望增量相等。
- 由上述结论,多算一次dp算出增量乘起来就可以了。
拓扑序
给定一张n个点的有向图,f(E)表示边集E的拓扑序个数,令E取遍该图的边集的所有子集,求f(E)的和(n≤20)
- 设T为图的边集,E为边集T的一个子集,P为子集中点的选取顺序的一个排列,g(E,P)={10P为合法拓扑序P不是合法拓扑序
- 则∑f(E)=∑E⊆T∑PisPerg(E,P),即对于边集的每个子集合的所有选取顺序是合法拓扑序的数量。
- 交换上述式子内外循环,则∑f(E)=∑PisPer∑E⊆Tg(E,P),即对于每个点的选取顺序中,边的子集使得点的选取顺序是合法拓扑序的数量。
- 拓扑序合法,即对于边集中的每条边(a,b),若都有p[a]>p[b],则拓扑序合法
- 对于访问序列p,令D(p)=有几条边(a,b)⊆T使p[a]>p[b],则上述式子可以转成∑PisPer2D(p),即对于当前访问顺序,合法的每一条边都可以任意选择加入边的子集与否,即2D(p)
- 考虑dp[S]。当前加入的点为S的二进制中为1的位编号,按照p[i]的大小,从大到小加点。则考虑新加入的点X(二进制表示) ,由于加入顺序为从大到小,若Y⊆S,则p[X]<p[Y],所以这时只需统计(X,Y),Y⊆S的数量即可。
- 综上转移方程为dp[S]=dp[S+X]∗2k。其中k为上述边的数量。
位运算
给定数组a[1…n],求∑1≤i<j≤na[i]xora[j],1≤n≤105,0≤a[i]<230
- 定义bit(x,i)={1:0:x的第i位为1x的第i位为0,则axorb=∑i=0292i(bit(a,i)=bit(b,i))
- 则原式:∑i=1n∑j=i+1n∑k=0292k(bit(a[i],k)=bit(a[j],k))
- 更换前后顺序,则原式:∑k=029∑i=1n∑j=i+1n2k(bit(a[i],k)=bit(a[j],k))
- 设数组b[i]=bit(a[i],k),则原式:∑k=029∑i=1n∑j=i+1nb[i]=b[j]
- 由于b[i]取值为0或1,设b数组中1的个数为x,0的个数为y,则∑i=1n∑j=i+1nb[i]=b[j]=x∗y
异或排序
给定一个长度为n的非负整数序列A[1..n],求有多少个不同的整数S满足以下条件:
1、0≤S<260
2、对于所有[1,n−1]中的i,有A[i] xor S≤(A[i+1] xor S)
1≤n≤20, 0≤A[i]<260
- 首先对于A[i] xor S≤A[i+1] xor S,可以发现当且仅当A[i]=A[i+1]时A[i] xor S=A[i+1] xor S,故原式=A[i] xor S<A[i+1] xor S
- 对于A[i]和A[i+1],及A[i] xor S和A[i+1] xor S比较大小。从高位到低位比较大小,相同继续,直到不同的第k位。
- 对不同的一位进行分析。由于需要使A[i]<A[i+1],则bit(A[i] xor S,k)<bit(A[i+1] xor S,k).
- 若bit(A[i],k)>bit(A[i+1],k),则bit(S,k)=1;若bit(A[i],k)<bit(A[i+1],k),则bit(S,k)=0
- 遍历数组,求出队S的n个限制。若限制有矛盾,则无解。否则,若S没有限制的位数为k,则答案为2k
和的XOR
给定数组a[1..n],求所有的a[i]+a[j] xor起来的值,其中1≤i<j≤n
- 对与1≤i<j≤n的所有数的第b位,结果相当于算bit(a[i]+a[j],b)为1的数量,是奇数则第b位为1,是偶数则第b位为0
- 考虑第b位为1的情况,此时x%2b+1≥2b。故上面的式子等于统计(a[i]+a[j])%2b+1≥2b的数量
- 令c[i]=a[i]%2b+1,则c[i]∈[0,2b+1),c[i]+c[j]∈[0,2b+2−1)
- (c[i]+c[j])%2b+1≥2b当且仅当{c[i]+c[j]∈[2b,2b+1)c[i]+c[j]∈[2b+2b+1,2b+2)时满足条件
- 对c数组排序,枚举每个左端点i,二分找到满足区间要求的l,r,则满足条件的数量+=(r-l+1)
给定数组a[1..n],求所有的a[i]+a[j] xor起来的值,其中1≤i,j≤n
- 对与所有的i=j,由于a[i]+a[j]会被xor两次,所以自己抵消掉了,最后就只剩下了i=j的情况,所以就是xor(2∗a[i])