#include <bits/stdc++.h>
using namespace std;
long long n, m;
long long k, l;
long long dx[] = {0, 0, 0, -1, 1};
long long dy[] = {0, -1, 1, 0, 0};
map<long long, long long> mp;
inline long long s(long long x, long long y) {
  if (mp[x * m + y]) return -(1 << 30);
  long long x1 = min(k, x), x2 = min(k, n - x + 1), y1 = min(k, y),
            y2 = min(k, m - y + 1);
  return (x1 + x2 - k) * (y1 + y2 - k);
}
struct node {
  long long x, y, z;
  bool operator<(const node& p) const { return z < p.z; }
};
priority_queue<node> q;
long long s2() {
  long long r = 0;
  node tn;
  tn.x = (n + 1) >> 1, tn.y = (m + 1) >> 1;
  tn.z = s(tn.x, tn.y);
  q.push(tn), mp[tn.x * m + tn.y] = 1;
  ;
  for (long long i = 1; i <= l; i++) {
    tn = q.top();
    q.pop(), r += tn.z;
    for (long long i = 1; i <= 4; i++) {
      long long px = tn.x + dx[i], py = tn.y + dy[i];
      if (px <= 0 || px > n || py <= 0 || py > m) continue;
      if (mp[px * m + py]) continue;
      node ttn;
      ttn.x = px, ttn.y = py, ttn.z = s(px, py);
      q.push(ttn);
      mp[px * m + py] = 1;
    }
  }
  return r;
}
signed main() {
  scanf("%lld%lld%lld%lld", &n, &m, &k, &l);
  printf("%.10lf", s2() * 1.0 / ((n - k + 1.0) * (m - k + 1.0)));
  return 0;
}
