#include #include #include #include #define REP(i,a,b) for(i=a;i 1e-200) rep(j, 4) if(edge1[i][j] >= 0) next[edge1[i][j]] += dp[i] * p1[j]; swap = dp, dp = next, next = swap; } res[height] = 0; rep(i, num_state) if(is_reachable[i]) res[height] += dp[i]; rest--; if(rest <= 0) return height; if(rest > 10 && height > 10){ sum = 0; sum += ab(res[height ] / res[height-1] - res[height-1] / res[height-2]); sum += ab(res[height-1] / res[height-2] - res[height-2] / res[height-3]); sum += ab(res[height-2] / res[height-3] - res[height-3] / res[height-4]); if(sum < 1e-12) rest = 10; } if(rest > 3 && res[height] < 1e-6) rest = 3; rep(i, num_state) next[i] = 0; rep(i, num_state) if(dp[i] > 1e-200) rep(j, 2) if(edge2[i][j] >= 0) next[edge2[i][j]] += dp[i] * p2[j]; swap = dp, dp = next, next = swap; } } #define EPS 1e-10 int main(){ int i,j,k,height; int R; ll C; double p, per; int T; int R_in[10000]; ll C_in[10000]; double p_in[10000]; double output[10000]; scanf("%d",&T); rep(i,T) scanf("%d%lld%lf",R_in+i, C_in+i, p_in+i); rep(i, T) if(R_in[i] == 1){ output[i] = pow(1-p_in[i], C_in[i]-1); } REP(R,2,9){ gen_state(R); rep(i, T) if(R_in[i] == R){ if(p_in[i] >= 0.999999){ output[i] = 0; continue; } height = do_dp(R, p_in[i],C_in[i]+1); if(C_in[i] <= height){ output[i] = res[C_in[i]]; } else { per = res[height] / res[height-1]; if(per > 1) per = 1; output[i] = res[height-1] * pow(per, C_in[i] - (height-1)); } } } rep(i,T) printf("%.15f\n", output[i]); return 0; }