#include <bits/stdc++.h>
using namespace std;
template <typename T, typename S>
inline bool upmin(T& a, const S& b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T, typename S>
inline bool upmax(T& a, const S& b) {
  return a < b ? a = b, 1 : 0;
}
template <typename N, typename PN>
inline N flo(N a, PN b) {
  return a >= 0 ? a / b : -((-a - 1) / b) - 1;
}
template <typename N, typename PN>
inline N cei(N a, PN b) {
  return a > 0 ? (a - 1) / b + 1 : -(-a / b);
}
template <typename N>
N gcd(N a, N b) {
  return b ? gcd(b, a % b) : a;
}
inline void gn(long long& x) {
  int sg = 1;
  char c;
  while (((c = getchar()) < '0' || c > '9') && c != '-')
    ;
  c == '-' ? (sg = -1, x = 0) : (x = c - '0');
  while ((c = getchar()) >= '0' && c <= '9') x = x * 10 + c - '0';
  x *= sg;
}
inline void gn(int& x) {
  long long t;
  gn(t);
  x = t;
}
inline void gn(unsigned long long& x) {
  long long t;
  gn(t);
  x = t;
}
inline void gn(double& x) {
  double t;
  scanf("%lf", &t);
  x = t;
}
inline void gn(long double& x) {
  double t;
  scanf("%lf", &t);
  x = t;
}
inline long long sqr(long long a) { return a * a; }
inline long double sqrf(long double a) { return a * a; }
int inf = 0x3f3f3f3f;
long double eps = 1e-6;
int mo = 1000000007;
int qp(int a, long long b) {
  int n = 1;
  do {
    if (b & 1) n = 1ll * n * a % mo;
    a = 1ll * a * a % mo;
  } while (b >>= 1);
  return n;
}
int N, pp;
long double p;
int sz = 50;
long double a[733][733];
long double b[733][733];
long double f[733][733];
long double sol(int n) {
  memset((a), (0), sizeof(a));
  memset((b), (0), sizeof(b));
  memset((f), (0), sizeof(f));
  for (int i = (1), _ed = (n + 1); i < _ed; i++) {
    a[i][1] = p;
    a[i][2] = 1 - p;
    b[i][2] = 1.0;
    for (int j = (2), _ed = (sz + 1); j < _ed; j++) {
      a[i][j] += a[i][j - 1] * a[i - 1][j - 1];
      b[i][j] += b[i][j - 1] * a[i - 1][j - 1];
    }
  }
  f[1][1] = p * (1 - p);
  for (int i = (2), _ed = (sz); i < _ed; i++) f[1][i] = a[n][i] - a[n][i + 1];
  for (int i = (2), _ed = (n + 1); i < _ed; i++)
    for (int las = (1), _ed = (sz + 1); las < _ed; las++) {
      for (int k = (1), _ed = (sz + 1); k < _ed; k++) {
        long double up = 0.0;
        if (las != 1 && k >= las) continue;
        if (las == 1 && k == 1) continue;
        if (las == 1) {
          up += f[i - 1][las] * (b[n - i + 1][k] - b[n - i + 1][k + 1]);
        } else {
          long double tmp;
          if (las == 2) {
            up += f[i - 1][las] * (k == 1);
          } else {
            if (n - i + 1 == 1) {
              up += f[i - 1][las] * ((k == 1) * p + (k == 2) * (1 - p));
            } else {
              if (k == 1)
                tmp = p * (1 - p);
              else
                tmp = a[n - i + 1][k] - a[n - i + 1][k + 1];
              up += f[i - 1][las] * tmp / (1 - a[n - i + 1][las]);
            }
          }
        }
        f[i][k] += up;
      }
    }
  long double su = 0.0;
  for (int i = (1), _ed = (n + 1); i < _ed; i++) {
    for (int k = (1), _ed = (sz + 1); k < _ed; k++) {
      su += f[i][k] * k;
    }
  }
  return su;
}
int main() {
  gn(N);
  gn(pp);
  p = pp / 1e9;
  if (N == 1) {
    printf("%.10lf\n", double(p * 1 + (1 - p) * 2));
    return 0;
  }
  if (N <= 700) {
    printf("%.10lf\n", double(sol(N)));
    return 0;
  }
  long double an1 = sol(699), an2 = sol(700);
  printf("%.10lf\n", double(an1 + (an2 - an1) * (N - 699)));
  return 0;
}
