昏暗周末第一题。。。。
题意:两个罐子,A和B;
开始的时候A中1球、B中2球,但每个罐子中都有一个红球。
每次从两个罐子分别中取出1个球。记录结果然后放回,放回的同时向两个罐子中分别增加1个白球
如此反复操作。
问n次操作中,至少有1次取出的两个球都是红球的概率。
若n次操作每次取出的球都是两个红球的概率小数点候有几个连续的0。
思路:
记f[i]表示前i次操作中至少有一次操作取出的两个球都是红球的概率, p[i]是第i次取出的两个球都是红球的概率。
则可推出一个递归关系: f[i+1] = f[i] + (1-f[i])*p[i]
f[1] = 1/2;
f[2] = f[1] + (1-f[1])*(1/2)*(1/3);
f[3] = f[2] + (1-f[2])*(1/3)*(1/4);
求另一个结果的时候用的是log函数来计算的。
ans = p[1]*p[2]*p[3]*p[4].......p[n]
log(ans) = log(p[1])+log(p[2])+log(p[3])+log(p[4])+........+log(p[n]);
我们只需用循环结果求出来就行了
正确答案就是log(ans)的整数部分。
代码如下:
#include <cstdio> #include <cmath> #define N 1000005 double p[N], q[N]; int n; void init() { p[0] = 0.0; for(int i = 1; i < N; i++) p[i] = p[i-1]+(1-p[i-1])/(1.0*i*(i+1)); q[0] = 0.0; for(int i = 1; i < N; i++) q[i] = q[i-1]+log10(1.0*i*(i+1)); } int main () { init(); while(~scanf("%d",&n)) { printf("%.6lf %d\n",p[n],(int)q[n]); } return 0; }