题意:
有一根绳子,在上面随机选取k个切点,将其切成k+1段,求这些线段能够成k+1边形的概率。
分析:
要构成k+1边形,必须最长的线段小于其他k个线段之和才行。
紫书上给出了一种解法,但是感觉理解得不是太好,所以又去网上找了其他解法。
知乎上有人问过这个问题,而且给出了很多种严格的解法。
最后代码里将(1LL << i)写成(1 << i),这种细节应当注意。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 typedef long long ll; 3 4 ll gcd(ll a, ll b) 5 { 6 if(b == 0) return a; 7 return gcd(b, a % b); 8 } 9 10 const int maxn = 50; 11 ll a[maxn + 5], b[maxn + 5]; 12 13 void Init_table() 14 { 15 b[1] = 1; 16 for(int i = 2; i <= maxn; ++i) 17 { 18 ll g; 19 b[i] = 1ll << i; 20 a[i] = b[i] - i - 1; 21 g = gcd(a[i], b[i]); 22 a[i] /= g, b[i] /= g; 23 } 24 } 25 26 int main() 27 { 28 Init_table(); 29 int t; 30 scanf("%d", &t); 31 for(int kase = 1; kase <= t; ++kase) 32 { 33 int k; 34 scanf("%d", &k); 35 scanf("%d", &k); 36 printf("Case #%d: %lld/%lld\n", kase, a[k], b[k]); 37 } 38 39 return 0; 40 }