#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
struct node {
  int x, y;
  double val;
  friend bool operator<(const node &a, const node &b) { return a.val < b.val; }
};
int n, m, r, k;
double ans = 0.0;
priority_queue<node> q;
map<pair<int, int>, int> mp;
bool judge(int x, int y) {
  return x >= 1 && x <= n && y >= 1 && y <= m &&
         (mp.count(make_pair(x, y)) == 0);
}
double getv(int x, int y) {
  double xx = min(min(1.00 * x, n - x + 1.00), min(n - r * 1.00 + 1, 1.00 * r));
  double yy = min(min(1.00 * y, m - y + 1.00), min(m - r * 1.00 + 1, 1.00 * r));
  return xx * yy / 1.00 / (n - r + 1) / (m - r + 1);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> r >> k;
  q.push({r, r, getv(r, r)});
  mp[make_pair(r, r)] = 1;
  while (k--) {
    node now = q.top();
    int nx = now.x, ny = now.y;
    double nval = now.val;
    ans += nval;
    q.pop();
    if (judge(nx + 1, ny)) {
      mp[make_pair(nx + 1, ny)];
      q.push({nx + 1, ny, getv(nx + 1, ny)});
    }
    if (judge(nx - 1, ny)) {
      mp[make_pair(nx - 1, ny)];
      q.push({nx - 1, ny, getv(nx - 1, ny)});
    }
    if (judge(nx, ny + 1)) {
      mp[make_pair(nx, ny + 1)];
      q.push({nx, ny + 1, getv(nx, ny + 1)});
    }
    if (judge(nx, ny - 1)) {
      mp[make_pair(nx, ny - 1)];
      q.push({nx, ny - 1, getv(nx, ny - 1)});
    }
  }
  printf("%.12f\n", ans);
}
