UVa 11971 (概率) Polygon

题意:

有一根绳子,在上面随机选取k个切点,将其切成k+1段,求这些线段能够成k+1边形的概率。

分析:

要构成k+1边形,必须最长的线段小于其他k个线段之和才行。

紫书上给出了一种解法,但是感觉理解得不是太好,所以又去网上找了其他解法。

知乎上有人问过这个问题,而且给出了很多种严格的解法。

最后代码里将(1LL << i)写成(1 << i),这种细节应当注意。

 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
", kase, a[k], b[k]);
37     }
38 
39     return 0;
40 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4189331.html