题解:
设g[i]表示已经有i次正面,要到k次的期望次数。
g[i]=p*g[i+1]+(1-p)*g[i]+1
g[i]=g[i+1]+1/p
边界:g[k]=0
设f[i]表示已经有i次正面,要到k次的期望花费。
f[i]=p*(f[i+1]+2*(g[i+1]+1)-1)+(1-p)*(f[i]+2*(g[i]+1)-1)
移项化简即可。
边界f[k]=0。
P.S.poj不支持%lf。。。使用%f输出。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
double p;
double g[1002],f[1002];
int main() {
while (scanf("%d",&n)&&n) {
scanf("%lf",&p);
g[n]=0;
for (int i=n-1;~i;--i) g[i]=g[i+1]+1.0/p;
f[n]=0;
for (int i=n-1;~i;--i) f[i]=(p*(f[i+1]+2.0*g[i+1]+1)+(1.0-p)*(2.0*g[i]+1))/p;
printf("%.3f %.3f\n",g[0],f[0]);
}
return 0;
}