//hdu 4870 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<vector> #include<string> #include<cstring> #include <cmath> #include<algorithm> #include<stack> #include<queue> using namespace std; //每次会增加50分,达到1000分,相当于每次增加1分,达到20分。 //q=1-p dp[0]=1+p*dp[1]+q*dp[0]; 打一场比赛+以概率p变到1+以概率q变到0 //dp[1]=1+p*dp[2]+q*dp[0]; //let dp[0]=t[k]+dp[k]; t[k]是0到k的期望回合数 //dp[k]=1+p*dp[k+1]+q*dp[k-2] 代入dp[0]=t[k]+dp[k]得 //dp[0]-t[k]=1+p*(dp[0]-t[k+1])+q*(dp[0]-t[k-2]) //So t[k+1]=1/p+1/p*t[k]-(1/p-1)*t[k-2] //边界条件:t[0]=0 t[1]=1/p t[2]=1/p+1/p^2// //因为由前面dp的递推公式化简可得 dp[0]=1/p+dp[1]=t[1]+dp[1],dp[1]=1/p+1/p^2+dp[2]=t[2]+dp[2] //两个账号时,每次都用较低分数的账号,所以变化状态是(0,0)->(0,1)->(1,1)->(2,1)->(2,2)... //(0,0)->(0,1)期望的回合数是t[1]-t[0] //(0,1)->(1,1)期望的回合数是t[1]-t[0] //(1,1)->(2,1)期望的回合数是t[2]-t[1] //(2,1)->(2,2)期望的回合数是t[2]-t[1] //(18,18)->(18,19)期望的回合数是t[19]-t[18] //(18,19)->(19,19)期望的回合数是t[19]-t[18] //(19,19)->(20,19)期望的回合数是t[20]-t[19] //the sum is: t[19]+t[20]-2*t[0]=t[19]+t[20] double p; double t[22]; int main() { freopen("input.txt","r",stdin); while(scanf("%lf",&p)!=EOF) { t[0]=0; t[1]=1/p; t[2]=1/p+1/(p*p); for(int i=3;i<=20;i++) { t[i]=1/p+1/p*t[i-1]-(1/p-1)*t[i-3]; } double ans=t[19]+t[20]; printf("%lf\n",ans); } return 0; }