import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class Jorke { public static void main(String[] args) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { new Jorke().run(new Scanner(reader)); } } public void run(Scanner sc) throws IOException { int c = sc.nextInt(); long t = sc.nextLong(), r = sc.nextLong(); double p = sc.nextDouble(); double epsilon = 0.000000001; double[][] DP = new double[c + 1][c + 1]; for (int x = 1; x <= c; x++) { double[] row = new double[c + 1]; double low = epsilon; double upp = 1e18; while (upp - low > epsilon && upp / low > 1 + epsilon) { double mid = (low + upp) / 2; for (int y = 1; y < x; y++) { row[y] = Math.min(1 + p * (r + mid) + (1 - p) * row[y - 1], t + DP[y][y]); } row[x] = 1 + p * (r + mid) + (1 - p) * row[x - 1]; if (row[x] > mid) low = mid; else upp = mid; } DP[x] = row; } System.out.println(DP[c][c] + t); } }