#include <bits/stdc++.h>
using namespace std;
struct Node {
  int x, y;
  long long val;
  bool operator<(const Node &a) const { return val < a.val; }
};
int n, m, r, k;
int Num(Node &a) {
  if (a.x == (n + 1) / 2 && (n & 1) && a.y == (m + 1) / 2 && (m & 1)) return 1;
  if (a.x == (n + 1) / 2 && (n & 1) || a.y == (m + 1) / 2 && (m & 1)) return 2;
  return 4;
}
int main() {
  priority_queue<Node> q;
  cin >> n >> m >> r >> k;
  int tx, ty;
  tx = min(r, n - r + 1);
  ty = min(r, m - r + 1);
  Node pos;
  pos.x = (n + 1) >> 1;
  pos.y = (m + 1) >> 1;
  pos.val = min(tx, pos.x) * min(ty, pos.y);
  long double ans1 = 0;
  long double ans = 0;
  long double all = (n - r + 1LL) * (m - r + 1LL);
  q.push(pos);
  set<pair<int, int> > s;
  s.insert(make_pair(pos.x, pos.y));
  while (k > 0) {
    pos = q.top();
    q.pop();
    int num = Num(pos);
    num = min(num, k);
    k -= num;
    ans1 += pos.val * num / ((n - r + 1LL) * (m - r + 1LL) * 1.0);
    Node tmp;
    tmp.x = pos.x;
    tmp.y = pos.y - 1;
    tmp.val = min(tx, tmp.x) * min(ty, tmp.y);
    if (tmp.y > 0 && (!s.count(make_pair(tmp.x, tmp.y)))) {
      s.insert(make_pair(tmp.x, tmp.y));
      q.push(tmp);
    }
    tmp.x = pos.x - 1;
    tmp.y = pos.y;
    tmp.val = min(tx, tmp.x) * min(ty, tmp.y);
    if (tmp.x > 0 && (!s.count(make_pair(tmp.x, tmp.y)))) {
      s.insert(make_pair(tmp.x, tmp.y));
      q.push(tmp);
    }
  }
  printf("%.12Lf\n", ans1);
  return 0;
}
