#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
int n, m, r, k;
struct Node {
  pair<int, int> p;
  int v;
  Node() {}
  Node(pair<int, int> p, int v = 0) : p(p), v(v) {}
  void calc() {
    int t1 = (n - r + 1) - max(0, (p.first - 1 - r + 1)) -
             max(0, (n - p.first - r + 1));
    int t2 = (m - r + 1) - max(0, (p.second - 1 - r + 1)) -
             max(0, (m - p.second - r + 1));
    v = t1 * t2;
  }
  bool operator<(const Node& t) const { return v < t.v; }
};
priority_queue<Node> Q;
set<pair<int, int> > vis;
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
bool in(pair<int, int> x) {
  return 1 <= x.first && x.first <= n && 1 <= x.second && x.second <= m;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &k);
  pair<int, int> s((n + 1) / 2, (m + 1) / 2);
  Node t(s);
  t.calc();
  vis.insert(s);
  Q.push(t);
  long long tot = 0;
  while (k--) {
    t = Q.top();
    Q.pop();
    tot += t.v;
    for (int i = 0; i < 8; i++) {
      pair<int, int> nxt(t.p.first + dx[i], t.p.second + dy[i]);
      if (!in(nxt)) continue;
      if (vis.count(nxt)) continue;
      vis.insert(nxt);
      Node nnxt(nxt);
      nnxt.calc();
      Q.push(nnxt);
    }
  }
  printf("%.10f\n", (double)tot / (double)(n - r + 1) / (double)(m - r + 1));
  return 0;
}
