链接:
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 }