Posted onSymbols count in article: 1kReading time ≈4 mins.
Problem
【NOIP2018模拟3】手拉手
TimeLimit:1000ms MemoryLimit:131072K
Description
小 P 是个幼儿园老师。有一天,他组织 n 个小朋友玩游戏。游戏开始时,每个小朋友伸出两只手,没有手相互拉在一起。每次,小 P 等概率随机挑选两只空着的手,让这两只手拉在一起。小 P 一直重复这个操作,直到所有的手都拉在一起。小 P 在成为幼儿园老师之前是个数学专业的博士。因此,他想知道,当所有的手都拉在一起之后,小朋友们拉成的圈个数的期望是多少?其中,我们规定,一个小朋友左手拉右手的情况也形成一个圈。
由于小 P 忙着和小朋友们玩游戏,他找到了聪明的你,希望你能帮他解决这个问题。
Explanation #1
小 P 组织 2 个小朋友玩游戏,我们称他们为小 A 和小 B。小 A 的左手等概率和小 A 的右手、小 B 的左手、小 B 的右手拉在一起,每一种情况的概率均为 31 。若小 A 的左右手拉起来,那么最终会形成 2 个圈,因为小 B 也必然左右手拉住。若小 A 的左手和小 B 的任意一只手拉起来,那么最终会形成一个圈,因为小 A 的右手必然和小 B 的另一只手拉住。那么,根据期望的公式,小 A 和小 B 拉成的圈个数的期望为
#include<bits/stdc++.h> #define MAX_N 1000000 usingnamespace std; typedefdouble dnt; const dnt C = 0.57721566490153286060651209; template <classT> inlinevoidread(T &x){ x = 0; int c = getchar(), f = 1; for (; !isdigit(c); c = getchar()) if (c == 45) f = -1; for (; isdigit(c); c = getchar()) (x *= 10) += f*(c-'0'); } intmain(){ dnt n; read(n); if (n <= MAX_N) { dnt sum = 0; for (dnt i = 1; i <= n; i++) sum += 1/(2*i-1); printf("%.9lf\n", sum); } elseprintf("%.9lf\n", log(n)/2+C/2+log(2)); return0; }