概率方程很好写,但是有环
可以看出来dp[0][k]-dp[k][k]是一组
分组求,可以设参数也可以高斯消元
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
double p,q;
struct Dian
{
double a;
double b;
}dp[25];
int main()
{
while(scanf("%lf",&p)!=EOF)
{
q=1-p;
int i,j;
double temp=0,yu;
for(i=19;i>0;i--)
{
dp[0].a=1;dp[0].b=0;
dp[1].a=(1-q)/p;dp[1].b=-(1/p);
dp[2].a=(dp[1].a-q)/p;dp[2].b=(dp[1].b-1)/p;
for(j=3;j<=i+1;j++)
{
dp[j].a=(dp[j-1].a-q*dp[j-3].a)/p;
dp[j].b=(dp[j-1].b-q*dp[j-3].b-1)/p;
}
yu=(temp-dp[i+1].b)/dp[i+1].a;
temp=dp[i-1].a*yu+dp[i-1].b;
}
printf("%.8lf\n",(p*temp+1)/(1-q));
}
return 0;
}