func_code_string: #include <bits/stdc++.h>   using namespace std;   double n, m, k, r;   double f(int x, int y) {     x++;     y++;     return (min(n + 1, x + r) - max((double)x, r)) *            (min(m + 1, y + r) - max((double)y, r));   }   int main() {     cin >> n >> m >> r >> k;     double ans = 0;     double nbpos = (n - r + 1) * (m - r + 1);     int tot = 0;     priority_queue<pair<double, pair<int, int> > > q;     pair<double, pair<int, int> > cur;     q.push(make_pair(f(n / 2, m / 2), make_pair(n / 2, m / 2)));     set<pair<int, int> > done;     done.insert(make_pair(n / 2, m / 2));     pair<int, int> pos;     while (tot < k) {       cur = q.top();       pos = cur.second;       q.pop();       ans += cur.first;       if (pos.first - 1 >= 0 &&           done.find(make_pair(pos.first - 1, pos.second)) == done.end()) {         q.push(make_pair(f(pos.first - 1, pos.second),                          make_pair(pos.first - 1, pos.second)));         done.insert(make_pair(pos.first - 1, pos.second));       }       if (pos.first + 1 < n &&           done.find(make_pair(pos.first + 1, pos.second)) == done.end()) {         q.push(make_pair(f(pos.first + 1, pos.second),                          make_pair(pos.first + 1, pos.second)));         done.insert(make_pair(pos.first + 1, pos.second));       }       if (pos.second - 1 >= 0 &&           done.find(make_pair(pos.first, pos.second - 1)) == done.end()) {         q.push(make_pair(f(pos.first, pos.second - 1),                          make_pair(pos.first, pos.second - 1)));         done.insert(make_pair(pos.first, pos.second - 1));       }       if (pos.second + 1 < m &&           done.find(make_pair(pos.first, pos.second + 1)) == done.end()) {         q.push(make_pair(f(pos.first, pos.second + 1),                          make_pair(pos.first, pos.second + 1)));         done.insert(make_pair(pos.first, pos.second + 1));       }       tot++;     }     cout << setprecision(11) << ans / nbpos << endl;   }   