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\n", kase, a[k], b[k]);

37     }

38 

39     return 0;

40 }
代码君

 

你可能感兴趣的:(uva)