#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2333333;
long long n, m, r, k, M, k2, Mx, My;
long long cnt[Maxn], ans;
map<int, long long> T2[Maxn];
struct tp {
  long long x, y, s, a;
};
bool operator<(tp x, tp y) { return x.s < y.s; }
priority_queue<tp> T;
int main() {
  cin >> n >> m >> r >> k;
  k2 = k;
  if (n < m) swap(n, m);
  tp tmp;
  Mx = min(r, n - r + 1), My = min(r, m - r + 1);
  tmp.x = min(r, n - r + 1), tmp.y = min(r, m - r + 1);
  tmp.s = tmp.x * tmp.y;
  tmp.a = (tmp.x == Mx ? abs(n - r - r + 1) + 1 : 2) *
          (tmp.y == My ? abs(m - r - r + 1) + 1 : 2);
  if (tmp.a) T.push(tmp), T2[tmp.x][tmp.y] = 1;
  for (; k;) {
    tmp = T.top();
    ans += min(k, tmp.a) * tmp.s;
    k -= min(k, tmp.a);
    T.pop();
    if (tmp.y > 0) {
      tmp.y--;
      tmp.s = tmp.x * tmp.y;
      tmp.a = (tmp.x == Mx ? abs(n - r - r + 1) + 1 : 2) *
              (tmp.y == My ? abs(m - r - r + 1) + 1 : 2);
      if (tmp.a && !T2[tmp.x][tmp.y]) T.push(tmp), T2[tmp.x][tmp.y] = 1;
      tmp.y++;
    }
    if (tmp.x > 0) {
      tmp.x--;
      tmp.s = tmp.x * tmp.y;
      tmp.a = (tmp.x == Mx ? abs(n - r - r + 1) + 1 : 2) *
              (tmp.y == My ? abs(m - r - r + 1) + 1 : 2);
      if (tmp.a && !T2[tmp.x][tmp.y]) T.push(tmp), T2[tmp.x][tmp.y] = 1;
    }
  }
  printf("%.13lf\n", ans / (double)(n - r + 1) / (double)(m - r + 1));
  return 0;
}
