UVA - 10169 Urn-ball Probabilities!

来源:互联网 发布:14年流行的网络歌曲 编辑:程序博客网 时间:2024/06/06 03:02

题目大意:两个罐子,开始一个有一个红球,一个有一个红球一个白球,每次取一个球(放回),然后多放一个白球进去。给定n,求出取n次出现取得两个红球的概率。和取n次都是两个红球的概率的小数点后面的0有几位。


解题思路:第一个问题:取n次出现取得两个红球的概率=1 -  取n次一次都没出现取得两个红球的概率

第二个问题:每次都取到两红球概率不断叠乘上去 p[i] = p[i - 1] * (1 / (i * i + i)); 位数为  - lg(p[i])

要先打表预处理不然会超时。在处理第二个问题的时候,由于有精度误差,- lg(p[i]) 可以转化为  - lg(p[i - 1] * (1 / (i * i + i))) = - (lg(p[i - 1]) + lg(1 / (i * i + i))) = - lg(p[i - 1]) + lg(i * i + i); 这样,注意类型要用long long 不然100W^2 int是存不下的

#include <cstdio>#include <cmath>const int N = 1000005;double p[N] = {1}, q[N] = {0};int main() {for (long long i = 1; i < N; i++) {p[i] = (1 - (1.0 / (i * i + i))) * p[i - 1];q[i] += q[i - 1] + log10(i * i + i);}int n;while (scanf("%d", &n) != EOF)printf("%.6lf %d\n", 1 - p[n], (int)q[n]);return 0;}


0 0
原创粉丝点击