【题解】P6130 随机红包

· · 题解

2021/06/29 更新:添加了详细的推式子过程,以及修改了排版。

如果有人问我推过最恶心的式子是哪个,我会说是这题。

我就不打表找规律,推式子警告

我们设 f(n,k,x) 表示有 n 个人的情况下,第 k 小的红包钱数大于 x 的概率。这也等价于至少 n-k+1 个红包的钱数大于 x 的概率。这里推荐使用第二种定义,方便理解后面的递推边界。

那么,容易看出我们要求的答案 ans(n,k)=\int_0^1f(n,k,x)dx

考虑 f 的递推式,n 个人时生成了 n-1 个随机数,设这些随机数里最小的那个是 v。此时一定有一个金额为 v 的红包,讨论 vx 的大小关系:

如果 v<x,那么剩下 n-1 个红包里就需要 n-k+1 个红包大于 x

如果 v>x,那么剩下 n-1 个红包里就需要 n-k 个红包大于 x

再想想,“1-v 块钱分成 n-1 个红包有 n-k+1 个红包大于 x”和“1 块钱分成 n-1 个红包有 n-k+1 个红包大于 \frac{x}{1-v}”是一样的,可以理解为通货膨胀了(?)

还有一个问题,虽然随机数是均匀分布的,但 n-1 个随机数中的最小值 v 可不是均匀分布的。我们要求出这个最小值小于 v 的概率是 1-(1-v)^{n-1},然后对它求导得到 (n-1)(1-v)^{n-2},这个可以认为是最小值为 v 的相对概率

综合上述讨论,可以得到 f 的递推式

\begin{aligned} &f(n,k,x)\\ =&(n-1)\int_0^x(1-v)^{n-2}f(n-1,k-1,\frac{x}{1-v})dv\\ +&(n-1)\int_x^1(1-v)^{n-2}f(n-1,k,\frac{x}{1-v})dv \end{aligned}

开始积分

\begin{aligned} &\int_0^1f(n,k,x)dx\\ =&(n-1)\int_0^1\int_0^x(1-v)^{n-2}f(n-1,k-1,\frac{x}{1-v})dvdx\\ +&(n-1)\int_0^1\int_x^1(1-v)^{n-2}f(n-1,k,\frac{x}{1-v})dvdx \end{aligned}

t=\frac{x}{1-v} 然后化简一波,此处省略去了漫长的计算过程

\begin{aligned} &\int_0^1f(n,k,x)dx\\ =&\frac{n-1}{n}\int_0^{+\infty} (1-\frac{1}{(t+1)^n})f(n-1,k-1,t)dt\\ +&\frac{n-1}{n}\int_0^{+\infty} \frac{1}{(t+1)^n}f(n-1,k-1,t)dt \end{aligned}

注意这里积分上界变成了 {+\infty},不是 1,因为 t 的范围可以到正无穷大,而且当 k=n+1,x>1f(n,k,x) 仍然有意义且值为 1,所以一定要积到正无穷大!下面推边界的时候也有这方面的说明

貌似得到了更复杂的式子,出现了 \frac{1}{(t+1)^n} 这个因子,我们用同样的方法继续积分看看

\begin{aligned} &\int_0^{+\infty} \frac{1}{(x+1)^{(n+1)}}f(n,k,x)dx\\ =&\frac{n-1}{n}\int_0^{+\infty} (\frac{1}{(t+1)^n}-\frac{1}{(2t+1)^n})f(n-1,k-1,t)dt\\ +&\frac{n-1}{n}\int_0^{+\infty} \frac{1}{(2t+1)^n}f(n-1,k-1,t)dt \end{aligned}

事情逐渐清晰起来,可以猜想并证明:

\begin{aligned} &\int_0^{+\infty} \frac{1}{(lx+1)^{(n+1)}}f(n,k,x)dx\\ =&\frac{n-1}{n}\int_0^{+\infty} (\frac{1}{(lt+1)^n}-\frac{1}{((l+1)t+1)^n})f(n-1,k-1,t)dt\\ +&\frac{n-1}{n}\int_0^{+\infty} \frac{1}{((l+1)t+1)^n}f(n-1,k-1,t)dt \end{aligned}

这回可以递推了。设

P(n,k,l)=\int_0^{+\infty} \frac{1}{(lx+1)^{(n+1)}}f(n,k,x)dx

则有

P(n,k,l)=\frac{n-1}{n}(P(n-1,k-1,l)-P(n-1,k-1,l+1)+P(n-1,k,l+1))

递推边界通过 Pf 的定义可以计算:

P(n,k,l) = \begin{cases} 0, & k=0; \\ \int_0^{+\infty} (lx+1)^{-n-1}dx=\frac{1}{ln}, & k=n+1;\\ \int_0^1 (lx+1)^{-2}dx=\frac{1}{l+1}, & n=1;\\ \end{cases}

这里为什么 n=1 时积到 1k=n+1 时要积到 {+\infty} 呢,因为 x>1f(1,1,x)=0,但是 k=n+1f(n,k,x) 表示的是至少 0 个红包大于 x 的概率,那么无论 x 为何值 f(n,k,x) 的值都为 1

最终答案就是 P(n,k,0)

那么这玩意怎么化简呢

首先我们看着 \frac{n-1}{n} 这个因子很难受,不妨修改一下 P 的定义,用 P(n,k,l) 表示之前 nP(n,k,l) 表示的意思,那么递推式和边界都要修改,顺便还能把递推式改为等价的更简洁的形式

P(n,k,l) = \begin{cases} 0, & n=0,k\le0; \\ \frac{1}{l}, & n=0,k>0;\\ P(n-1,k-1,l)-P(n-1,k-1,l+1)+P(n-1,k,l+1), & n>0 \end{cases}

此时 ans(n,k)=\frac{1}{n}P(n,k,0)

假设从 P(n,k,0) 递归到 n=0 共调用了 aP(n-1,k-1,l) 分支,bP(n-1,k-1,l+1) 分支,cP(n-1,k,l+1) 分支。需要满足 a+b+c=na+b<k。那么这部分的贡献就是 \frac{n!(-1)^b}{a!b!c!(b+c)},总和为

P(n,k,0)=\sum_{a+b+c=n,a+b<k} \frac{n!(-1)^b}{a!b!c!(b+c)}

继续化简

\begin{aligned} P(n,k,0)=&\sum_{a+b+c=n,a+b<k} \frac{n!(-1)^b}{a!b!c!(b+c)}\\ =&\sum_{a=0}^{k-1} \frac{n!}{a!(n-a)}\sum_{b=0}^{k-a-1} (-1)^b\frac{1}{b!(n-a-b)!}\\ =&\sum_{a=0}^{k-1} \frac{n!}{a!(n-a)!(n-a)}(-1)^{k-a-1}C(n-a-1,k-a-1)\\ =&\frac{n!}{(n-k)!}\sum_{a=0}^{k-1} \frac{(-1)^{k-a-1}}{(n-a)^2a!(k-a-1)!}\\ =&\frac{n!}{(n-k)!}\frac{1}{(k-1)!}\sum_{a=0}^{k-1} (-1)^{k-a-1}C(k-1,a)(a-n)^{-2}\\ =&\frac{n!}{(n-k)!}\frac{1}{(k-1)!}\sum_{a=0}^{k-1} (-1)^{k-a-1}C(k-1,a)\sum_{j=0}^{\infty}C(-2,j)a^j(-n)^{-2-j}\\ =&\frac{n!}{(n-k)!}\sum_{j=0}^{\infty}C(-2,j)(-n)^{-2-j}\frac{1}{(k-1)!}\sum_{a=0}^{k-1} (-1)^{k-a-1}C(k-1,a)a^j\\ =&\frac{n!}{(n-k)!}\sum_{j=0}^{\infty}(j+1)n^{-2-j}S_2(j,k-1) \end{aligned}

G_m(x) 是第二类斯特林数第 m 列的普通生成函数,G_m'(x) 为其导数。我们有:

G_m(x)=\sum_{i=0}^\infty S_2(i,m)x^i=\prod_{j=1}^m\frac{x}{1-jx} G_m'(x)=\sum_{j=1}^m\frac{1}{x(1-jx)}G_m(x)

原式可以写成生成函数的形式:

\begin{aligned} P(n,k,0)=&\frac{n!}{(n-k)!}\sum_{j=0}^{\infty}(j+1)n^{-2-j}S_2(j,k-1)\\ =&\frac{n!}{(n-k)!} (n^{-3}G_{k-1}'(\frac{1}{n})+n^{-2}G_{k-1}(\frac{1}{n}))\\ =&\frac{n!}{(n-k)!} n^{-2} (1+\sum_{j=1}^{k-1}\frac{n}{n-j})G_{k-1}(\frac{1}{n})\\ =&\frac{n!}{(n-k)!} n^{-1} (\sum_{l=n-k+1}^{n}\frac{1}{l})\prod_{j=1}^{k-1}\frac{1}{n-j}\\ =&\sum_{l=n-k+1}^{n}\frac{1}{l} \end{aligned}

这回可以快速计算多组询问了。别忘了除以 n!!

ans(n,k)=\frac1n\sum_{l=n-k+1}^n\frac1l

提醒:比赛时遇到这种题果断打表找规律。