#include <bits/stdc++.h>
using namespace std;
int n, m, r, k;
const int Next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int Calc(int x, int y) {
  return (min(n, x + r - 1) - max(x, r) + 1) *
         (min(m, y + r - 1) - max(y, r) + 1);
}
struct Node {
  int x, y, step;
  bool operator<(const Node& nd) const { return Calc(x, y) < Calc(nd.x, nd.y); }
};
priority_queue<Node> que;
map<int, map<int, int> > mp;
void Solve() {
  Node nd;
  nd.x = n + 1 >> 1;
  nd.y = m + 1 >> 1;
  mp[nd.x][nd.y] = 1;
  nd.step = 0;
  long long sum = 0, cnt = 0;
  que.push(nd);
  while (!que.empty()) {
    nd = que.top();
    que.pop();
    cnt++;
    sum += Calc(nd.x, nd.y);
    if (cnt == k) break;
    for (int i = 0; i < 4; i++) {
      int tx = nd.x + Next[i][0], ty = nd.y + Next[i][1];
      if (tx < 1 || tx > n || ty < 1 || ty > m) continue;
      if (mp[tx][ty]) continue;
      Node cur;
      mp[tx][ty] = 1;
      cur.x = tx;
      cur.y = ty;
      cur.step = nd.step + 1;
      que.push(cur);
    }
  }
  printf("%.11lf", sum / (double)(n - r + 1) / (double)(m - r + 1));
}
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &k);
  Solve();
  return 0;
}
