func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, a, b, ed;   double p, M;   long long T;   vector<pair<double, double> > v;   pair<double, double> sta[100004];   double cros(pair<double, double> a, pair<double, double> b) {     return (b.second - a.second) / (a.first - b.first);   }   double r[100004], ret;   double mat[35][3][3], cur[3];   int main() {     scanf( %d%I64d , &n, &T);     for (int i = 0; i < n; i++) {       scanf( %d%d%lf , &a, &b, &p);       M = max(M, p * b);       v.push_back(make_pair(p, -p * a));     }     sort(v.begin(), v.end());     for (int i = 0; i < n; i++) {       if (i > 0 && v[i].first == v[i - 1].first) continue;       v[i].second *= -1;       while (ed > 1 && cros(sta[ed - 1], sta[ed]) > cros(sta[ed], v[i])) ed--;       sta[++ed] = v[i];     }     for (int i = 1; i < ed; i++) r[i] = cros(sta[i], sta[i + 1]);     r[ed] = 1e18 + 114;     double lst = 0;     long long t1 = 0;     for (int i = 1; i <= ed; i++) {       if (t1 == T || (t1 * M - lst) >= r[i]) continue;       mat[0][0][0] = 1 - sta[i].first, mat[0][0][1] = 0, mat[0][0][2] = 0;       mat[0][1][0] = sta[i].first * M, mat[0][1][1] = 1, mat[0][1][2] = 0;       mat[0][2][0] = sta[i].second, mat[0][2][1] = 1, mat[0][2][2] = 1;       for (int j = 1; j <= 33; j++) {         for (int i1 = 0; i1 < 3; i1++)           for (int j1 = 0; j1 < 3; j1++) {             mat[j][i1][j1] = 0;             for (int k = 0; k < 3; k++)               mat[j][i1][j1] += mat[j - 1][i1][k] * mat[j - 1][k][j1];           }       }       for (int j = 33; j >= 0; j--) {         if (t1 + (1ll << j) >= T) continue;         cur[0] = lst, cur[1] = t1, cur[2] = 1;         ret = 0;         for (int k = 0; k < 3; k++) ret += cur[k] * mat[j][k][0];         if (M * (t1 + (1ll << j)) - ret < r[i]) lst = ret, t1 += (1ll << j);       }       cur[0] = lst, cur[1] = t1, cur[2] = 1;       lst = 0;       for (int j = 0; j < 3; j++) lst += cur[j] * mat[0][j][0];       t1++;     }     printf( %.6lf , lst);   }   