#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
struct Matrix {
  int n, m;
  long double a[55][55];
  Matrix() {}
  Matrix(int n, int m) : n(n), m(m) {}
  Matrix operator*(Matrix b) {
    Matrix o = Matrix(n, b.m);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < b.m; j++) {
        o.a[i][j] = 0;
        for (int k = 0; k < m; k++) {
          o.a[i][j] += (a[i][k] * b.a[k][j]);
        }
      }
    }
    return o;
  }
  Matrix pow(long long p) {
    Matrix o = Matrix(n, m);
    Matrix b = *this;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) o.a[i][j] = (i == j);
    while (p > 0) {
      if (p & 1) o = o * b;
      b = b * b;
      p >>= 1;
    }
    return o;
  }
};
long double P, A[55][55], B[55][55], dp[55][55];
void fmain() {
  scanf("%d%Lf", &n, &P);
  P /= 1e9;
  for (int i = 1; i <= 50; i++)
    for (int(j) = 1; (j) <= (int)(50); (j)++) {
      if (j == 1) A[i][j] += P;
      if (j == 2) {
        A[i][j] += 1 - P;
        B[i][j] += 1 - P;
      }
      A[i][j] += A[i][j - 1] * A[i - 1][j - 1];
      B[i][j] += A[i][j - 1] * A[i - 1][j - 1];
    }
  for (int i = 50; i; i--) {
    for (int(j) = 1; (j) <= (int)(50); (j)++) {
      A[i][j] *= (1 - A[i - 1][j]);
      B[i][j] *= (1 - A[i - 1][j]);
    }
  }
  for (int(j) = 1; (j) <= (int)(2); (j)++) dp[1][j] = j;
  for (int i = 2; i <= 50; i++) {
    for (int j = 1; j <= 50; j++) {
      long double s = 0, t = 0;
      if (j == 1) {
        for (int k = 2; k <= 50; k++) {
          s += B[i - 1][k];
          t += dp[i - 1][k] * B[i - 1][k];
        }
      } else {
        for (int k = 1; k < j; k++) {
          s += A[i - 1][k];
          t += dp[i - 1][k] * A[i - 1][k];
        }
      }
      dp[i][j] = j + t / s;
    }
  }
  int N = 51;
  Matrix rt = Matrix(1, N), pw = Matrix(N, N);
  for (int(j) = 1; (j) <= (int)(50); (j)++) rt.a[0][j] = dp[50][j];
  rt.a[0][0] = 1;
  pw.a[0][0] = 1;
  for (int(j) = 1; (j) <= (int)(50); (j)++) pw.a[0][j] = j;
  long double s = 0;
  for (int k = 2; k <= 50; k++) s += B[50][k];
  for (int k = 2; k <= 50; k++) pw.a[k][1] = B[50][k] / s;
  for (int j = 2; j <= 50; j++) {
    s = 0;
    for (int k = 1; k < j; k++) {
      s += A[50][k];
    }
    for (int k = 1; k < j; k++) {
      pw.a[k][j] = A[50][k] / s;
    }
  }
  long double ans = 0;
  if (n <= 50) {
    for (int(j) = 1; (j) <= (int)(50); (j)++) ans += dp[n][j] * A[n][j];
  } else {
    rt = rt * pw.pow(n - 50);
    for (int(j) = 1; (j) <= (int)(50); (j)++) ans += rt.a[0][j] * A[50][j];
  }
  printf("%.10Lf\n", ans);
}
int main() {
  fmain();
  return 0;
}
