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;
}


 

 

你可能感兴趣的:(uva)