概率相关知识点

1、P(X=K)=P(X>=K)P(X>K)P(X=K)=P(X>=K)-P(X>K)

2、E[x]=1P(Xi)E[x]=\sum_1^\infty P(X\ge i)

3、P(A)=PP(A)=P,则一直随机直到发生事件A的期望次数为1P\frac{1}{P}

每次随机一个[1…n]的数,期望随机几次能随机出全部的数

  • Ti:T_i:当前有i个数,第一次随机到新的数
  • E[x]=0n1E[Ti]E[x]=\sum_0^{n-1}E[T_i]
  • P(Ti)=ninP(T_i)=\frac{n-i}{n}
  • E[Ti]=1P(Ti)=nniE[T_i]=\frac{1}{P(T_i)}=\frac{n}{n-i}
  • E[x]=0n1nni=1nniE[x]=\sum_0^{n-1}\frac{n}{n-i}=\sum_1^n\frac{n}{i}

随机一个长度为n的序列p,p[i]p[i]p[1..i]p[1..i]​中最大的概率

  • 设随机变量xjx_j,当p[j]p[j]p[1..i]p[1..i]中最大值时为1,否则为0
  • 1iXj=1\sum_1^iX_j=1
  • 因为随机序列,则E(X1)=E(X2)=E(X3)=...E(X_1)=E(X_2)=E(X_3)=...
  • E(Xi)=1iE(X_i)=\frac{1}{i}

随机游走:

一个n个点的完全图,求从s走到t的期望时间

  • 从一个点走到任意另一个点的概率:1n1\frac{1}{n - 1},则次数的期望为n1n-1

一条长度为n的链,从一端走到另一端的期望时间

  • Xi:X_i:第一次走到ii到第一次走到i+1i+1用的次数
  • E(x)=0n1E(Xi)E(x)=\sum_0^{n-1}E(X_i)
  • E(Xi)=12+12(1+E(Xi1)+E(Xi)E(X_i)=\frac{1}{2}+\frac{1}{2}(1+E(X_{i-1})+E(X_i)12\frac{1}{2}概率直接从ii走到i+1i+112\frac{1}{2}的概率从ii走到i1i-1,此时期望为一次加i1i-1走到ii的期望和ii走到i+1i+1的期望
  • 由上式可得E(Xi)=2+E(Xi1)E(X_i)=2+E(X_{i-1})

给定nn​个硬币,第ii​个硬币的价值是wiw_i​​​,每次随机取走一个硬币,获得收益是左右两个硬币的价值的乘积,求期望总价值

  • Xij:X_{ij}:ii个硬币和第jj个硬币相邻的期望
  • E(x)=ijwiwjE(Xij)E(x)=\sum_{ij}w_i*w_j*E(X_{ij})
  • E(Xij)E(X_{ij})为从iijj中取硬币,全部取完且最后两个是ijij的概率,所以是iijj所有数-2的全排列除以iijj所有数的全排列乘以2
  • E(Xij)=2(ji1)!(ji+1)!=2(ji+1)(ji)E(X_{ij})=\frac{2*(j-i-1)!}{(j-i+1)!}=\frac{2}{(j-i+1)*(j-i)}

线性性与等价性的应用

随机一个1...n1...n的排列ppp[i]p[i]p[1...n]p[1...n]中前kk​大的概率

  • xix_i为1则p[i]p[i]为前k大,否则为0
  • E(x)=E(xi)=kE(x)=\sum E(x_i)=k
  • E(xi)=knE(x_i)=\frac{k}{n}

给定一棵n个点的有根树,一开始每个点都是白色, 每次等概率随机选择一个白点,将整个子树都染成黑色,问期望随机几次能把整棵树染黑

  • XiX_i,当ii被选中的时候为1,否则为0,则E(X)=1nE(Xi)E(X)=\sum_{1}^{n}E(X_i)
  • 对于E(Xi)E(X_i),由于i点和其祖先节点在不被选中的时候其他点可以任意选择,故仅需考虑i点和其祖先节点
  • 仅考虑i点和其祖先节点时(共有x个祖先节点),需要i点第一个被选中,则概率为1x+1\frac{1}{x+1}
  • E(Xi)=1depi+1E(X_i)=\frac{1}{dep_i+1}

有n堆石头,每堆个数为a[i],现在每次等概率随机选一个石头,然后将那个石头所在的那堆石头全扔了,直到第一堆石头被扔掉,问期望扔几次

  • xix_i,当ii被扔的时候为1,否则为0,E(x)=1nE(xi)E(x)=\sum_1^nE(x_i)
  • 对于E(xi)E(x_i),第ii堆被扔当且仅当第11堆在第ii堆之后扔
  • E(xi)=aia1+aiE(x_i)=\frac{a_i}{a_1+a_i}

对于一个1…n的排列p,定义他的价值为:所有满足p[i]>max(p[i1],p[i+1])p[i]>max(p[i-1],p[i+1])ii​的和。现在随机一个排列p,求价值的期望

  • xix_i,当p[i]>max(p[i1],p[i+1])p[i]>max(p[i-1],p[i+1])时为ii,否则为00E(x)=1nE(xi)E(x)=\sum_1^nE(x_i)

  • i=1i=1 or i=ni=n时,p[i]p[i]满足条件的概率为12\frac{1}{2},则期望分别为E(x1)=12E(x_1)=\frac{1}{2}E(xn)=n2E(x_n)=\frac{n}{2}

  • 1<i<n1<i<n时,考虑相邻三个数p[i1],p[i],p[i+1]p[i-1],p[i],p[i+1]p[i]p[i]为三个数中最大的数的概率为13\frac{1}{3},所以E(xi)=i3E(x_i)=\frac{i}{3}

等概率随机一个长度为n的01串,定义01串的价值为:所有全1连续子串的长度的平方和,求价值的期望

  • 对于一个含有全1子串长度为len1,len2,...,lenklen_1,len_2,...,len_k的01串,X=leni2X=\sum len_i^2
  • 对于一个长度为n的全1串,其包含子串个数为n(n+1)2=12(n2+n)\frac{n(n+1)}{2}=\frac{1}{2}(n^2+n)
  • 将以上问题转化为对01串全部子区间的和问题,则X=每个区间是否全1X=\sum每个区间是否全1
  • xijx_{ij},当区间i...ji...j中全部为1时,xij=1x_{ij}=1,否则为0
  • 对于一个长度为n的全1子串,由于其子串数量为12(n2+n)\frac{1}{2}(n^2+n)。所以对于一个全1串来说会被统计12(n2+n)\frac{1}{2}(n^2+n)次,则此时对于这个全1串来说,他的权值是12(n2+n)\frac{1}{2}(n^2+n)
  • 题目求的价值为所有全1连续子串的长度的平方和,所以对上述每一个全1串权值进行变换即可得到最终答案
  • 设第i个全1子串的价值为XiX_i,则该子串的在当前问题下的实际价值为2Xin2*X_i-n
  • X=2ijxiji=1nxiiX=2*\sum_{i\le j}x_{ij}-\sum_{i=1}^{n}x_{ii}
  • E(X)=2ijE(xij)i=1nE(xii)E(X)=2*\sum_{i\le j}E(x_{ij})-\sum_{i=1}^{n}E(x_{ii})
  • E(xij)=(12)ji+1E(x_{ij})=(\frac{1}{2})^{j-i+1}E(xii)=12E(x_{ii})=\frac{1}{2},带入求和即可

上面题的另一个版本做法(可能会较上一个版本难理解):

  • 设两个随机变量Xi,YiX_i,Y_iXiX_i表示的是在添加第i+1i+1个字符的时候答案的增量,YiY_i表示的是前ii个字符后缀1的长度。
  • 当末尾添加字符为1时,Xi=(E(Yi)+1)2E(Yi)2=2E(Yi)+1X_i=(E(Y_i)+1)^2-E(Y_i)^2=2E(Y_i)+1。当末尾添加字符为0时,Xi=0X_i=0
  • 当末尾添加字符为1时,Yi=Yi1+1Y_i=Y_{i-1}+1,当末尾添加字符为0时,Yi=0Y_i=0
  • E(Xi)=120+12(2E(Yi)+1)E(X_i)=\frac{1}{2}*0+\frac{1}{2}(2E(Y_i)+1)E(Yi)=120+12(E(Yi1)+1)E(Y_i)=\frac{1}{2}*0+\frac{1}{2}(E(Y_{i-1})+1)
  • 由于XiX_i表示的是答案的增量,故答案X=0n1E(Xi)X=\sum_0^{n-1} E(X_i)

等概率随机一个排列p[1...n]p[1...n],定义f(p)f(p)为有多少个ii满足p[i]p[i]p[1...i]p[1...i]的最大值,求f(p)f(p)f(p)2f(p)^2​的期望

  • xix_ip[i]p[i]p[1...i]p[1...i]最大值时为1,否则为0
  • X=f(p)X=f(p),则E(X)=1nE(xi)=1n1iE(X)=\sum_1^nE(x_i)=\sum_1^n\frac{1}{i}
  • X2=(1nxi)2=ijxixj+1nxi2X^2=(\sum_1^nx_i)^2=\sum_{i\ne j}x_ix_j+\sum_1^nx_i^2​​​,其中xi={10x_i= \begin{cases}1 \\0 \end{cases},故xi2=xix_i^2=x_i,则原式=ijxixj+1nxi=\sum_{i\ne j}x_ix_j+\sum_1^nx_i​​​
  • 由上式可得E(X2)=ijE(xixj)+1nE(xi)E(X^2)=\sum_{i\ne j}E(x_ix_j)+\sum_1^nE(x_i)
  • 考虑i<ji<j时,p[j]p[j]p[1...j]p[1...j]的最大值的概率为1j\frac{1}{j},则去掉p[j]p[j]后,前j1j-1个数字是完全随机的,则p[i]p[i]p[1...i]p[1...i]中最大的数的概率为1i\frac{1}{i},则p[j]p[j]p[1...j]p[1...j]的最大值且p[i]p[i]p[1...i]p[1...i]的最大值的概率为1ij\frac{1}{ij},则E(xixj)=P(xixj)=1ijE(x_ix_j)=P(x_ix_j)=\frac{1}{ij}
  • 综上E(X2)=ij1ij+i=1n1iE(X^2)=\sum_{i\ne j}\frac{1}{ij}+\sum_{i=1}^n\frac{1}{i}

给定一个字符串T,和一个字符串序列S[1…n]

选择k次来构造一个字符串,每次随机从S[1…n]中随机选一个字符串拼接到已构造的串后面

求T在构造的串中的期望出现次数

T50,n50,S[i]<=50,k<=1012|T|\le50,n\le50,|S[i]|<=50,k<=10^{12}

  • 首先考虑k50k\le50的情况。此时可以通过dp暴力算出答案
  • dp[i][j]dp[i][j]表示加入第ii个串后kmp指针指在jj时的状态
  • 对于每个i,ji,j,枚举每个字符串,算出当前ii个字符串kmp指针指在jj时,加入字符串s[i]s[i]​后T出现的次数xx,以及kmp指针指向的位置jj',得到转移方程dp[i+1][j]=dp[i][j]+xdp[i+1][j']=dp[i][j]+x。最后枚举dp[k][j]dp[k][j],算出所有情况的出现次数除以k!k!即可。
  • 再考虑k>50k>50的情况。考虑极限情况,当加入一个新的字符串的时候,TT的出现次数最多会与前5050​个串有关系(s[i]=1s[i]=1的时候)
  • f[k]f[k]​表示拼接kk​次后的期望次数,则可以推出结论当k>Tk>|T|​时有f[k+1]f[k]=f[k+2]f[k+1]f[k+1]-f[k]=f[k+2]-f[k+1]​,即k>Tk>|T|时期望增量相等。
  • 由上述结论,多算一次dp算出增量乘起来就可以了。

拓扑序

给定一张nn个点的有向图,f(E)f(E)表示边集E的拓扑序个数,令EE取遍该图的边集的所有子集,求f(E)f(E)​的和(n20n\le20​)

  • TT​​​​为图的边集,EE​​为边集TT​​的一个子集,PP​​为子集中点的选取顺序的一个排列,g(E,P)={1P为合法拓扑序0P不是合法拓扑序g(E,P)=\begin{cases} 1&P为合法拓扑序\\0&P不是合法拓扑序\end{cases}​​
  • f(E)=ETPisPerg(E,P)\sum f(E)=\sum_{E\subseteq T}\sum_{PisPer}g(E,P)​,即对于边集的每个子集合的所有选取顺序是合法拓扑序的数量。
  • 交换上述式子内外循环,则f(E)=PisPerETg(E,P)\sum f(E)=\sum_{PisPer}\sum_{E\subseteq T}g(E,P)​​,即对于每个点的选取顺序中,边的子集使得点的选取顺序是合法拓扑序的数量。
  • 拓扑序合法,即对于边集中的每条边(a,b)(a,b),若都有p[a]>p[b]p[a]>p[b],则拓扑序合法
  • 对于访问序列pp,令D(p)=有几条边(a,b)T使p[a]>p[b]D(p)=有几条边(a,b)\subseteq T使p[a]>p[b],则上述式子可以转成PisPer2D(p)\sum_{PisPer}2^{D(p)},即对于当前访问顺序,合法的每一条边都可以任意选择加入边的子集与否,即2D(p)2^{D(p)}
  • 考虑dp[S]dp[S]。当前加入的点为SS的二进制中为1的位编号,按照p[i]p[i]的大小,从大到小加点。则考虑新加入的点X(二进制表示) ,由于加入顺序为从大到小,若YSY\subseteq S,则p[X]<p[Y]p[X]<p[Y],所以这时只需统计(X,Y),YS(X,Y),Y\subseteq S的数量即可。
  • 综上转移方程为dp[S]=dp[S+X]2kdp[S]=dp[S+X]*2^k。其中kk为上述边的数量。

位运算

给定数组a[1…n],求1i<jna[i]xora[j]\sum_{1\le i<j\le n}a[i]\,xor\,a[j]​​,1n105,0a[i]<2301\le n\le 10^5, 0\le a[i]<2^{30}​​​​​

  • 定义bit(x,i)={1:x的第i位为10:x的第i位为0bit(x,i)=\begin{cases}1:&x的第i位为1\\0:&x的第i位为0\end{cases},则axorb=i=0292i(bit(a,i)bit(b,i))a\,xor\,b=\sum_{i=0}^{29}2^i(bit(a,i)\ne bit(b,i))
  • 则原式:i=1nj=i+1nk=0292k(bit(a[i],k)bit(a[j],k))\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=0}^{29}2^k(bit(a[i],k)\ne bit(a[j],k))​​
  • 更换前后顺序,则原式:k=029i=1nj=i+1n2k(bit(a[i],k)bit(a[j],k))\sum_{k=0}^{29}\sum_{i=1}^n\sum_{j=i+1}^n2^k(bit(a[i],k)\ne bit(a[j],k))
  • 设数组b[i]=bit(a[i],k)b[i]=bit(a[i],k),则原式:k=029i=1nj=i+1nb[i]b[j]\sum_{k=0}^{29}\sum_{i=1}^n\sum_{j=i+1}^nb[i]\ne b[j]
  • 由于b[i]b[i]取值为0或1,设b数组中1的个数为x,0的个数为y,则i=1nj=i+1nb[i]b[j]=xy\sum_{i=1}^n\sum_{j=i+1}^nb[i]\ne b[j]=x*y

异或排序

给定一个长度为nn的非负整数序列A[1..n]A[1..n],求有多少个不同的整数SS满足以下条件:

1、0S<2600\le S<2^{60}

2、对于所有[1,n1][1,n-1]中的ii,有A[i] xor S(A[i+1] xor S)A[i]\ xor\ S\le(A[i+1]\ xor\ S)

1n20, 0A[i]<2601\le n\le 20,\ 0\le A[i]<2^{60}

  • 首先对于A[i] xor SA[i+1] xor SA[i]\ xor\ S \le A[i + 1]\ xor\ S,可以发现当且仅当A[i]=A[i+1]A[i]=A[i+1]A[i] xor S=A[i+1] xor SA[i]\ xor\ S = A[i + 1]\ xor\ S,故原式=A[i] xor S<A[i+1] xor SA[i]\ xor\ S < A[i + 1]\ xor\ S
  • 对于A[i]A[i]A[i+1]A[i+1],及A[i] xor SA[i]\ xor\ SA[i+1] xor SA[i + 1]\ xor\ S​​​​比较大小。从高位到低位比较大小​,相同继续,直到不同的第k位。
  • 对不同的一位进行分析。由于需要使A[i]<A[i+1]A[i]<A[i+1],则bit(A[i] xor S,k)<bit(A[i+1] xor S,k)bit(A[i]\ xor\ S,k)<bit(A[i+1]\ xor\ S,k).
  • bit(A[i],k)>bit(A[i+1],k)bit(A[i],k)>bit(A[i+1],k),则bit(S,k)=1bit(S,k)=1;若bit(A[i],k)<bit(A[i+1],k)bit(A[i],k)<bit(A[i+1],k),则bit(S,k)=0bit(S,k)=0
  • 遍历数组,求出队SSnn个限制。若限制有矛盾,则无解。否则,若S没有限制的位数为k,则答案为2k2^k

和的XOR

给定数组a[1..n]a[1..n]​,求所有的a[i]+a[j]a[i]+a[j]​ xor起来的值,其中1i<jn1\le i<j\le n

  • 对与1i<jn1\le i<j\le n的所有数的第bb位,结果相当于算bit(a[i]+a[j],b)bit(a[i]+a[j],b)为1的数量,是奇数则第bb位为1,是偶数则第bb位为0
  • 考虑第b位为1的情况,此时x%2b+12bx\%2^{b+1}\ge 2^b。故上面的式子等于统计(a[i]+a[j])%2b+12b(a[i]+a[j])\%2^{b+1}\ge2^b​的数量​
  • c[i]=a[i]%2b+1c[i]=a[i]\%2^{b+1}​​,则c[i][0,2b+1)c[i]\in[0,2^{b+1})​​,c[i]+c[j][0,2b+21)c[i]+c[j]\in[0,2^{b+2}-1)​​
  • (c[i]+c[j])%2b+12b(c[i]+c[j])\%2^{b+1}\ge2^b​当且仅当{c[i]+c[j][2b,2b+1)c[i]+c[j][2b+2b+1,2b+2)\begin{cases}c[i]+c[j]\in[2^b,2^{b+1})\\c[i]+c[j]\in[2^b+2^{b+1},2^{b+2})\end{cases}​时满足条件
  • 对c数组排序,枚举每个左端点ii,二分找到满足区间要求的l,rl,r,则满足条件的数量+=(r-l+1)

给定数组a[1..n]a[1..n]​​​,求所有的a[i]+a[j]a[i]+a[j]​​​ xor起来的值,其中1i,jn1\le i,j\le n​​

  • 对与所有的iji\ne j,由于a[i]+a[j]a[i]+a[j]​​​会被xor两次,所以自己抵消掉了,最后就只剩下了i=ji=j的情况,所以就是xor(2a[i])xor(2*a[i])