#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int cx[4] = {1, -1, 0, 0}, cy[4] = {0, 0, 1, -1};
int line[maxn], col[maxn];
struct node {
  int x, y;
  double z;
  friend bool operator<(const node &a, const node &b) { return a.z < b.z; }
};
map<pair<int, int>, int> vis;
priority_queue<node> q;
int main() {
  int n, m, r, k;
  scanf("%d%d%d%d", &n, &m, &r, &k);
  for (int i = 1; i <= (n + 1) / 2; i++) {
    if (i <= n - r + 1)
      line[i] = min(i, r);
    else
      line[i] = line[i - 1];
  }
  for (int i = n, j = 1; i > (n + 1) / 2; i--, j++) line[i] = line[j];
  for (int i = 1; i <= (m + 1) / 2; i++) {
    if (i <= m - r + 1)
      col[i] = min(i, r);
    else
      col[i] = col[i - 1];
  }
  for (int i = m, j = 1; i > (m + 1) / 2; i--, j++) col[i] = col[j];
  double tot = (double)(n - r + 1) * (m - r + 1), ans = 0.0;
  node now, next;
  now.x = (n + 1) / 2, now.y = (m + 1) / 2;
  now.z = (double)line[now.x] * col[now.y] / tot;
  q.push(now);
  vis[make_pair(now.x, now.y)] = 1;
  while (k--) {
    now = q.top();
    q.pop();
    ans += now.z;
    for (int i = 0; i < 4; i++) {
      int nx = now.x + cx[i], ny = now.y + cy[i];
      if (nx > 0 && nx <= n && ny > 0 && ny <= m && !vis[make_pair(nx, ny)]) {
        next.x = nx, next.y = ny,
        next.z = (double)line[next.x] * col[next.y] / tot;
        q.push(next);
        vis[make_pair(nx, ny)] = 1;
      }
    }
  }
  printf("%.10lf\n", ans);
  return 0;
}
