#include <bits/stdc++.h>
using namespace std;
map<long long, int> mp;
struct node {
  long long ex, i, j;
  node(long long ex, long long i, long long j) : ex(ex), i(i), j(j) {}
  bool operator<(const node &x) const { return ex < x.ex; }
};
priority_queue<node> pq;
int main() {
  long long n, m, c, k, i, j, l, r, u, d, x, y;
  long long sum = 0;
  long long dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
  cin >> n >> m >> c >> k;
  x = (n + 1) / 2, y = (m + 1) / 2;
  mp[x * (long long)100000 + y] = 1;
  u = max(1LL, x - c + 1);
  d = min(n, x + c - 1);
  l = max(1LL, y - c + 1);
  r = min(m, y + c - 1);
  pq.push(node((d - u - c + 2) * (r - l - c + 2), x, y));
  while (k--) {
    node now = pq.top();
    pq.pop();
    sum += now.ex;
    for (i = 0; i < 4; i++) {
      x = now.i + dir[i][0];
      y = now.j + dir[i][1];
      if (!mp[x * (long long)100000 + y]) {
        mp[x * (long long)100000 + y] = 1;
        u = max(1LL, x - c + 1);
        d = min(n, x + c - 1);
        l = max(1LL, y - c + 1);
        r = min(m, y + c - 1);
        pq.push(node((d - u - c + 2) * (r - l - c + 2), x, y));
      }
    }
  }
  double ans = ((double)sum) / (double)((n - c + 1) * (m - c + 1));
  printf("%.10lf", ans);
  return 0;
}
