UVa 11971

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3122

题意:

有一根长度为n的木条,随机选k个位置把它们切成k+1段小木条。求这些小木条能组成一个多边形的概率。

分析:

不难发现本题的答案与n无关。在一条直线上切似乎难以处理,可以把直线接成一个圆,
多切一下,即在圆上随机选k+1个点,把圆周切成k+1段。根据对称性,两个问题的答案相同。
新问题就要容易处理得多了:“组不成多边形”的概率就是其中一个小木条至少跨越了半个圆周的概率。
设这个最长的小木条从点i开始逆时针跨越了至少半个圆周,则其他所有点都在这半个圆周之外。
除了点i之外其他每个点位于这半个圆周之外的概率均为1/2,因此总概率为1/(2^k)。
点i的取法有k+1种,因此“组不成多边形”的概率为(k+1)/(2^k),能组成多边形的概率为1-((k+1)/(2^k))。

代码:

 1 #include <cstdio>
 2 
 3 typedef long long int LLI;
 4 
 5 LLI gcd(LLI a, LLI b) {
 6     return b == 0 ? a : gcd(b, a%b);
 7 }
 8 
 9 int main() {
10     int T, n, k;
11     scanf("%d", &T);
12     for(int cases = 1; cases <= T; cases++) {
13         scanf("%d%d", &n, &k);
14         LLI b = 1LL << k;
15         LLI a = b - (k+1);
16         printf("Case #%d: %lld/%lld
", cases, a/gcd(a,b), b/gcd(a,b));
17     }
18     return 0;
19 }
原文地址:https://www.cnblogs.com/hkxy125/p/9601833.html