func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1000005;   int n, k;   int v[N], c[N], p[N];   double f[N];   double C(int n, int m) { return f[n] - f[m] - f[n - m]; }   struct Node {     int Max, Min;   } node[N * 4];   void pushup(int x) {     node[x].Max = max(node[((x << 1) + 1)].Max, node[((x << 1) + 2)].Max);     node[x].Min = min(node[((x << 1) + 1)].Min, node[((x << 1) + 2)].Min);   }   void build(int l, int r, int x = 0) {     if (l == r) {       node[x].Max = v[l];       node[x].Min = c[l];       return;     }     int mid = (l + r) >> 1;     build(l, mid, ((x << 1) + 1));     build(mid + 1, r, ((x << 1) + 2));     pushup(x);   }   int Max1, Min1;   void rmq(int l, int r, int L = 1, int R = n, int x = 0) {     if (L >= l && R <= r) {       Max1 = max(Max1, node[x].Max);       Min1 = min(Min1, node[x].Min);       return;     }     int mid = (L + R) >> 1;     if (l <= mid) rmq(l, r, L, mid, ((x << 1) + 1));     if (r > mid) rmq(l, r, mid + 1, R, ((x << 1) + 2));   }   int main() {     scanf( %d%d , &n, &k);     for (int i = 1; i <= n; i++) scanf( %d , &v[i]);     for (int i = 1; i <= n; i++) scanf( %d , &c[i]);     p[n] = min(v[n] * 100, c[n]);     int pre = n;     int Max = v[n], Min = c[n];     for (int i = n - 1; i >= 1; i--) {       Max = max(Max, v[i]);       Min = min(Min, c[i]);       if (min(Max * 100, Min) < min(v[i] * 100, c[i])) Max = v[i], Min = c[i];       p[i] = min(Max * 100, Min);     }     sort(p + 1, p + 1 + n);     for (int i = 1; i <= n; i++) f[i] = f[i - 1] + log(i * 1.0);     double ans = 0;     for (int i = 1; i <= n; i++) {       if (k - 1 > n - i) break;       ans += exp(log(p[i] * 1.0) + C(n - i, k - 1) - C(n, k));     }     printf( %.12f n , ans);     return 0;   }   