有n根鞋带混在一起,现在重复n次以下操作:随机抽出两个鞋带头,把它们绑在一起。可以想象,这n次之后將不再有单独的鞋带头,n条鞋带系成了一些环。那么有多大概率刚好所有这些鞋带只形成了一个环?
Input
仅一行,包含一个整数n (2<=n<=1000)。
Output
输出一行,为刚好成环的概率。
Input示例
2
Output示例
0.666667 我觉得正确的思维方式应该是先求出通项公式A[n]=.......(定义A[i]为i个绳子时恰好组成环的概率) 然后得到A[n+1]=...... 然后由A[n+1]/A[n]得到递推关系 因为A[1]=1是显而易见的 之后由数学归纳法能得到所有的概率 想法很美好,可是无奈数学太差A[n]的通项一直推导不出来 希望有数学好的大牛能够做出来后分享一下 所以就去网上看了好多博客,看到一种递推关系A[i]=A[i-1]* 2*(i-1)/( 2*(i-1)+1 )感觉 最清晰的一种思理解方式是 当A[i-1]确定要推出A[i]时,A[i-1]要乘上加上第i根鞋带依然能成环的概率 即: n根鞋恰成环的概率=n-1根鞋带恰成环的概率 * 第n根鞋带插入由n-1根鞋带构成的环中而也恰成为一环的概率。 分子 2*(i-1)为第i根鞋带插入由i-1根鞋带围成的环时有i-1个插入点,乘2是因为鞋带可以正反插入 分母 2*(i-1)+ 1 2*(i-1)同上 加1是加上自己成环的情况#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<stack> using namespace std; #define LL long long double ans[1200]; int main() { ans[1]=1; for(int i=2;i<=1000;i++) ans[i]=ans[i-1]*( 2*i-2 )/(double)( 2*i-1 ); int n; while(cin>>n) { cout<<ans[n]<<endl; } return 0; }