0398 割绳子
* * * *
拉格朗日计划
* * * *
割绳子

在一条长为n的绳子上,分布有间距为1的n-1个点。随机选择其中m-1个,并在所选的点处切开绳子使之分成m段。

记$E(n, m)$为把这些绳段按长度从小到大排列后第二段绳的期望长度。例如$E(3,2)=2, E(8,3)=16/7$。

求$E(10^7,100)$,结果四舍五入到小数点后5位。

本题难度:



解答

最小长度不小于k的割法共有$\binom{n-m(k-1)-1}{m-1}$(把一个符合要求的分割中每一块都缩小k-1即可)种,从而最小长度恰等于k的概率是 $$p_k=\frac{\binom{n-m(k-1)-1}{m-1}-\binom{n-mk-1}{m-1}}{\binom{n-1}{m-1}},$$ 将最小长度的块移除,第二小长度就又转化为最小长度的问题,可以用同样的方法计算,不过计数下界不同,因为若最小长度为k,则第二小的长度至少需要是k。

直接计数求和即可,结果是$2010.59096$。

注:因需使用math.comb函数,且为方便作除法和格式化输出,以下代码为Python 3。

import math

def f(a,k):
  b=[1]*len(a)
  s,c=0,1
  for i,q in enumerate(a):
    for j in range(len(a)):
      a[j]-=q*b[j]
      b[j]=b[j]*(j-i)//(i+1)
    c=c*(k-i)//(i+1)
    s+=q*c
  return s

n,m=10**7,100
x1=f([math.comb(n-1-m*s,m-1) for s in range(m)],n//m)
x2=m*f([math.comb(n-1-(m-1)*(t-1),m-1) for t in range(2,m+2)], (n-1)//(m-1)-1)
x3=m*f([math.comb(n-1-m*(t-1),m-1) for t in range(2,m+2)], n//m-1)
  
print(f"{(x1+x2-x3)/math.comb(n-1,m-1):.5f}")