uva 10169 - Urn-ball Probabilities !(概率)
题目链接:uva 10169 - Urn-ball Probabilities !
题目大意:在一个箱子中,原本有1个红球,然后任意取出(有放回)一个球,然后再往里放一个白球(每次取都要放进一个白球),给出n,表示取了n次球,要求输出至少有连续抽到两个红球的概率,以及没有连续抽到红球的概率,因为没有连续抽到红球的概率非常小,所以输出小数点后有几位为0.
解题思路:将每两次去球作为一次讨论,p = 1/(i * (i + 1),然后每次叠乘(1 - p)就可以得到q, (1 - q)为第一个答案。然后每次叠乘p得到ans,计算ans小数点后的0的个数,即为第二个答案。
#include <stdio.h> #include <stdlib.h> #include <math.h> const int N = 1000005; double q[N]; int cnt[N]; void init() { double p = 1, ans = 1; q[0] = 1; cnt[0] = 0; for (long long i = 1; i < N; i++) { p = 1./(i * i + i); q[i] = (1 - p) * q[i - 1]; ans *= p; cnt[i] = cnt[i - 1]; while (floor(ans) < 1e-10) { cnt[i]++; ans *= 10; } } } int main () { int n; init(); while (scanf("%d", &n) == 1) { printf("%.6lf %d\n", 1 - q[n], cnt[n] - 1); } return 0; }