#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5;
const long long MOD = 1e9 + 7;
long long n, m, r, k;
set<pair<long long, long long> > vis;
map<pair<long long, long long>, pair<long long, long long> > store;
priority_queue<pair<long long, pair<long long, long long> >,
               vector<pair<long long, pair<long long, long long> > > >
    pq;
long long getrow(long long x) {
  return min(x, min(n - x + 1, min(r, n - r + 1)));
}
long long getcol(long long y) {
  return min(y, min(m - y + 1, min(r, m - r + 1)));
}
void addneighbours(long long x, long long y, long long r, long long c) {
  for (long long dx = -1; dx <= 1; dx++) {
    for (long long dy = -1; dy <= 1; dy++) {
      long long newx = x + dx;
      long long newy = y + dy;
      pair<long long, long long> cur = {newx, newy};
      if (vis.find(cur) != vis.end()) {
        continue;
      }
      long long rowcontrib = getrow(newx);
      long long colcontrib = getcol(newy);
      pq.push(make_pair(rowcontrib * colcontrib, cur));
      vis.insert(cur);
      pair<long long, long long> cur2 = {rowcontrib, colcontrib};
      store[cur] = cur2;
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m >> r >> k;
  long long nosq = 1;
  long long lensq = 1;
  long long ans = 0;
  if (n % 2 && m % 2) {
    long long x = (n + 1) / 2;
    long long y = (m + 1) / 2;
    pair<long long, long long> p = {x, y};
    long long rowcontrib = getrow(x);
    long long colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
  } else if (n % 2 != m % 2) {
    if (n % 2) swap(n, m);
    long long x = (n + 1) / 2;
    long long y = (m + 1) / 2;
    pair<long long, long long> p = {x, y};
    long long rowcontrib = getrow(x);
    long long colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
    x = (n + 1) / 2 + 1;
    y = (m + 1) / 2;
    p = {x, y};
    rowcontrib = getrow(x);
    colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
  } else {
    long long x = (n + 1) / 2;
    long long y = (m + 1) / 2;
    pair<long long, long long> p = {x, y};
    long long rowcontrib = getrow(x);
    long long colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
    x = (n + 1) / 2 + 1;
    y = (m + 1) / 2;
    p = {x, y};
    rowcontrib = getrow(x);
    colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
    x = (n + 1) / 2 + 1;
    y = (m + 1) / 2 + 1;
    p = {x, y};
    rowcontrib = getrow(x);
    colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
    x = (n + 1) / 2;
    y = (m + 1) / 2 + 1;
    p = {x, y};
    rowcontrib = getrow(x);
    colcontrib = getcol(y);
    store[p] = {getrow(x), getcol(y)};
    vis.insert(p);
    pq.push(make_pair(rowcontrib * colcontrib, p));
  }
  while (k > 0) {
    pair<long long, pair<long long, long long> > p = pq.top();
    pq.pop();
    k--;
    pair<long long, long long> q = store[p.second];
    ans += p.first;
    addneighbours(p.second.first, p.second.second, q.first, q.second);
  }
  long double finans = ans;
  finans /= (n - r + 1);
  finans /= (m - r + 1);
  cout << fixed << setprecision(12) << finans;
  return 0;
}
