链接:

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))。

代码:

 #include <cstdio>

 typedef long long int LLI;

 LLI gcd(LLI a, LLI b) {
return b == ? a : gcd(b, a%b);
} int main() {
int T, n, k;
scanf("%d", &T);
for(int cases = ; cases <= T; cases++) {
scanf("%d%d", &n, &k);
LLI b = 1LL << k;
LLI a = b - (k+);
printf("Case #%d: %lld/%lld\n", cases, a/gcd(a,b), b/gcd(a,b));
}
return ;
}
05-11 11:15