func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 50;   struct matrix {     double m[N + 5][N + 5];     friend matrix operator*(const matrix &A, const matrix &B) {       matrix C;       for (int i = 0; i < N; i++)         for (int j = 0; j < N; j++) C.m[i][j] = 0;       for (int i = 0; i < N; i++)         for (int k = 0; k < N; k++)           for (int j = 0; j < N; j++) C.m[i][j] += A.m[i][k] * B.m[k][j];       return C;     }   } M;   matrix mpow(matrix A, int p) {     matrix R;     for (int i = 0; i < N; i++)       for (int j = 0; j < N; j++) R.m[i][j] = (i == j);     for (; p; p >>= 1, A = A * A)       if (p & 1) R = R * A;     return R;   }   int n;   double p;   double t[N + 5][N + 5], t2[N + 5][N + 5];   double s[N + 5][N + 5], s2[N + 5][N + 5];   double f[N + 5][N + 5];   void init() {     t[1][1] = p, t[1][2] = 1 - p;     for (int i = 2; i < N; i++) {       t[i][1] = p, t[i][2] = (1 - p) + p * p, t2[i][2] = 1;       for (int j = 3; j < N; j++)         t[i][j] = t[i][j - 1] * t[i - 1][j - 1],         t2[i][j] = t2[i][j - 1] * t[i - 1][j - 1];     }     for (int i = 1; i < N; i++)       for (int j = 1; j < N; j++)         s[i][j] = t[i][j] * (1 - t[i - 1][j]),         s2[i][j] = t2[i][j] * (1 - t[i - 1][j]);     s2[1][2] = 1;     double sum = 0;     for (int i = 1; i < N; i++) sum += s2[N - 1][i];     for (int i = 1; i < N; i++) M.m[1][i] = s2[N - 1][i] / sum;     sum = 0;     for (int i = 2; i < N; i++) {       sum += s[N - 1][i - 1];       for (int j = 1; j < i; j++) M.m[i][j] = s[N - 1][j] / sum;     }     for (int i = 1; i < N; i++) M.m[i][0] = i;     M.m[0][0] = 1;     f[1][1] = 1, f[1][2] = 2;     for (int i = 2; i < N; i++) {       sum = 0;       f[i][1] = 1;       for (int j = 1; j < N; j++) sum += s2[i - 1][j];       for (int j = 1; j < N; j++) f[i][1] += f[i - 1][j] * s2[i - 1][j] / sum;       sum = 0;       for (int j = 2; j < N; j++) {         f[i][j] = j, sum += s[i - 1][j - 1];         for (int k = 1; k < j; k++) f[i][j] += f[i - 1][k] * s[i - 1][k] / sum;       }     }     f[N - 1][0] = 1;   }   int main() {     scanf( %d%lf , &n, &p), p /= 1E9, init();     double ans = 0;     if (n >= N) {       M = mpow(M, n - N + 1);       for (int i = 0; i < N; i++)         for (int j = 0; j < N; j++) ans += M.m[i][j] * f[N - 1][j] * s[N - 1][i];     } else       for (int i = 1; i < N; i++) ans += s[n][i] * f[n][i];     printf( %.9f n , ans);   }   