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