Luogu 10月30日提高团队赛 U138098 超级蚯蚓
Description–
将两条超级蚯蚓的头或尾端接触,他们的头或尾会连接起来。
现在有n条这样的超级蚯蚓,重复n次以下操作:
- 随机抽出两条超级蚯蚓,使它们的头或尾接触。
可以发现n次操作之后将不再有条状蚯蚓,它们连接成了一些环。
那么有多大概率刚好所有这些超级蚯蚓只连成了一个环?
Input–
仅一行,包含一个整数 n n n。
Output–
输出一行,为刚好成环的概率。
Sample Input–
样例1
2
样例2
3
样例3
5
Sample Output–
样例1
0.666667
样例2
0.533333
样例3
0.406349
说明–
2 < = n < = 1000 2<=n<=1000 2<=n<=1000
解题思路–
(不用关注蚯蚓的头和尾,就把它看成线段就行辽)
我们先看
n
=
2
n = 2
n=2 的时候
此时有
6
6
6 种情况
-
1 1 1
-
2 2 2
-
3 3 3
-
4 4 4
-
5 5 5
-
6 6 6
可以发现,因为连完一次剩下的两个点必须连起来,于是有6种情况,其中有4种是合法的,答案就为 4 / 6
然后我们再看
n
=
3
n = 3
n=3 的情况
对于每个A点(任意一个点)都可以到别的端点,如图,橙色的是合法的,黄色的是不合法的,则第一步合法的概率为4 / 5,任意连一个合法的点,则 (某画图太难画了于是换了个介个233333)
可见点 2 (也就是前一个图的点A)连接了点 4 (合法的就行),即为
(加粗的是端点)即为
wow,这不是 n = 2 的情况吗(假装震惊)把 n = 2 时的结果命名为 f[2]
所以 f[3] = (4 / 5) * f[2]
所以 f[n] = 2 n − 2 2 n − 1 \frac{2n - 2}{2n - 1} 2n−12n−2 * f[n - 1]
代码–
#include <iostream>
#include <cstdio>
#define db double
using namespace std;
int n;
db f[1005];
int main()
{
scanf("%d", &n);
f[2] = (db)2 / (db)3;
for (int i = 3; i <= n; ++i)
f[i] = f[i - 1] * (2 * (db)(i - 1) / (db)(2 * (i - 1) + 1));
printf("%.6lf", f[n]);
return 0;
}