func_code_string: #include <bits/stdc++.h>   using namespace std;   using ld = long double;   using ll = long long;   using pii = pair<int, int>;   using pll = pair<ll, ll>;   using vi = vector<int>;   const int oo = 1e9 + 7;   const ll loo = 1e18;   ll modpow(ll a, ll b) {     ll res = 1;     while (b) {       if (b & 1) res = res * a % oo;       a = a * a % oo;       b /= 2;     }     return res;   }   ll gcd(ll a, ll b) { return a == 0 ? b : gcd(b % a, a); }   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   const int N = 5e5 + 7;   int n, k, m;   using point = complex<ll>;   point p[N];   ld dist[N];   vector<int> arms[N];   int gr[N];   int num;   ld cross(point a, point b) { return (conj(a) * b).imag(); }   ld dot(point a, point b) { return (conj(a) * b).real(); }   void input() {     map<pair<ll, ll>, int> id;     m = 0;     for (int i = 0; i < n; i++) {       ll a, b;       cin >> a >> b;       p[i] = point(a, b);       dist[i] = sqrt(dot(p[i], p[i]));       if (a == 0 && b == 0) continue;       ll g = gcd(abs(a), abs(b));       pair<ll, ll> ash = make_pair(a / g, b / g);       if (!id.count(ash)) id[ash] = m++;       arms[id[ash]].push_back(i);       gr[i] = id[ash];     }     for (int i = 0; i < m; i++) {       sort(begin(arms[i]), end(arms[i]),            [&](int i, int j) { return dist[i] < dist[j]; });     }   }   ld option1() {     priority_queue<pair<ld, int>> pq;     for (int i = 0; i < m; i++) {       for (int t = 0; t < min(k / 2, (int)arms[i].size()); t++) {         ld wei = (k - 2 * t - 1) * dist[arms[i][arms[i].size() - 1 - t]];         pq.push(make_pair(wei, arms[i][arms[i].size() - 1 - t]));       }     }     for (int i = 0; i < n; i++)       if (p[i] == point(0)) {         pq.push(make_pair(0, i));       }     ld ans = 0;     while (pq.size() && num < k) {       auto pp = pq.top();       pq.pop();       ans += pp.first;       num++;     }     return ans;   }   ld option2(int i, ld ans) {     int half = k / 2;     int s = num - half;     for (int t = 0; t < arms[i].size() - half; t++) {       ans += dist[arms[i][t]] * ((t + s) - (k - 1 - t - s));       if (t + 1 + num == k) break;     }     return ans;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n >> k;     input();     ld ans = option1();     if (num < k) {       ld res = 0;       for (int i = 0; i < m; i++)         if (2 * (n - arms[i].size()) <= k) {           res = max(res, option2(i, ans));         }       ans = res;     }     cout << setprecision(40) << ans << endl;     return 0;   }   