题目描述

有n盏红灯m盏绿灯,每次随机熄灭一盏,直到一种颜色的灯全部被熄灭,求剩下灯个数的期望。

输入格式

两个整数n和m,分别表示红灯个数和绿灯个数。

输出格式

一个小数,四舍五入保留六位小数。

样例输入

 10 20

样例输出

 2.294372

一般人思路

上来拿到这个题,wc这不一眼就是记忆化搜索吗
然后10分钟打完,调好,直接寄

可以看到是WA了四个点,再一看数据范围

是1e9的范围,但我代码的复杂度是\(o(n*m)\)的,不炸才怪,所以正解的复杂度要么是\(o(\log_{2}n)\)要么是\(o(1)\),只能靠玄学推式子了

但是话说9G你出的数据怎么回事,说好的80%呢???是不少给我两个测试点(强烈质疑9G造数据能力)

所以我不服,把dp优化了一晚上以后,照样过不了(向出题人妥协),就去请教了一位四川省的神犇,后来又花了半节晚课神犇才帮我把式子推明白

也是被傻逼可爱数学搞破防了,就发愤写了这篇题解

以下是正解

分析

先考虑把所有绿灯熄灭,只剩下k盏红灯,则可以确定最后k盏灯一定为红灯,倒数第k+1盏一定为绿灯,剩下还没有确定的共有n+m-k-1盏灯,其中有n-k个红灯和m-1个绿灯,然后就是熟悉的组合数求概率了

故只剩k盏红灯的概率为

\[\frac{C_{n+m-k-1}^{n-k}或C_{n+m-k-1}^{m-1}}{C_{n+m}^{n}} \]

它的贡献的话。。。就再乘上k就好了
所以只剩下红灯的总期望为

\[\frac{\sum\limits_{k=1}^{n}k*C_{n+m-k-1}^{n-k}}{C_{n+m}^{n}} \]

要求的式子

\[\frac{\sum\limits_{k=1}^{n}k*C_{n+m-k-1}^{n-k}+\sum\limits_{k=1}^{m}k*C_{n+m-k-1}^{m-k}}{C_{n+m}^{n}} \]

怎么化简?

这里用到一个组合数的小性质

\[C_{n}^{m}=C_{n-1}^{m}+C_{n-1}^{m-1} \]

可以结合杨辉三角理解一下

\[1\\ 1\ \ \ 1\\ 1\ \ \ 2\ \ \ 1\\ 1\ \ \ 3\ \ \ 3\ \ \ 1\\ 1\ \ \ 4\ \ \ 6\ \ \ 4\ \ \ 1\\ \]

\[C_{1}^{1}\\ C_{2}^{1}\ \ C_{2}^{2}\\ C_{3}^{1}\ \ C_{3}^{2}\ \ C_{3}^{3}\\ C_{4}^{1}\ \ C_{4}^{2}\ \ C_{4}^{3}\ \ C_{4}^{4}\\ C_{5}^{1}\ \ C_{5}^{2}\ \ C_{5}^{3}\ \ C_{5}^{4}\ \ C_{5}^{5}\\ \]

但是一眼看去这坨式子里好像并没有可以合并的两项,这时就需要用另一个性质巧妙地转化一下了:

不论n取哪个正整数,总有\(C_{n}^{0}=C_{n+1}^{0}=1\)

所以只要把分子上最后一项变成\(C_{m}^{0}\),就会发现往前每一项都可以合并,而最后有n个\(C_{m}^{0}\),所以合并n次就好了(这种像链式反应一样消掉式子的感觉真是太美妙了)

奇妙的化简

只剩红灯的总期望

\[\frac{1*C_{n+m-2}^{n-1}+2*C_{n+m-3}^{n-2}+...+(n-1)*C_{m}^{1}+n*C_{m-1}^{0}}{C_{n+m}^{n}}\\ \]

\[=\frac{C_{n+m-1}^{n-1}+C_{n+m-2}^{n-2}+...+C_{m+1}^{1}+C_{m}^{0}}{C_{n+m}^{n}}\\ \]

\[=\frac{C_{n+m}^{n-1}}{C_{n+m}^{n}}\\ \]

\[=\frac{\frac{(n+m)!}{(n-1)!*(m+1)!}}{\frac{(n+m)!}{n!*m!}}\\ \]

\[=\frac{n!*m!}{(n-1)!*(m+1)!}\\ \]

结论

所以,只剩红灯的总期望就是\(\frac{n}{m+1}\)

同理,只剩绿灯的总期望就是\(\frac{m}{n+1}\),两个加起来就是答案

最后直接输出ans$$\frac{n}{m+1}+\frac{m}{n+1}$$

宇宙超级无敌炫酷霹雳霸气AC极简代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;scanf("%d%d",&n,&m);
	return printf("%.6lf\n",1.0*n/(m+1)+1.0*m/(n+1)),0;
}

这完全就是一道纯数学题,只要式子推出来就A了

加强版:cats的随机原神

话说我为啥总是把灯打成