#include <bits/stdc++.h>
using namespace std;
long long n, m, r, k;
struct node {
  long long x, y, z;
  bool operator<(const node &rhs) const { return rhs.z > z; }
};
priority_queue<node> Q;
map<pair<long long, long long>, long long> mp;
long long disx[4] = {1, 0, -1, 0}, disy[4] = {0, 1, 0, -1};
signed main() {
  scanf("%lld%lld%lld%lld", &n, &m, &r, &k);
  long long i = (n + 1) / 2;
  long long j = (m + 1) / 2;
  long long a =
      (min(i + r - 1, n) - max(i, r) + 1) * (min(j + r - 1, m) - max(j, r) + 1);
  Q.push((node){i, j, a});
  mp[make_pair(i, j)] = 1;
  long long ans = 0;
  while (k--) {
    long long x = Q.top().x, y = Q.top().y;
    ans += Q.top().z;
    Q.pop();
    for (long long l = 0; l < 4; ++l) {
      long long nx = x + disx[l], ny = y + disy[l];
      if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && !mp[make_pair(nx, ny)]) {
        mp[make_pair(nx, ny)] = 1;
        Q.push((node){nx, ny,
                      (min(nx + r - 1, n) - max(nx, r) + 1) *
                          (min(ny + r - 1, m) - max(ny, r) + 1)});
      }
    }
  }
  printf("%.10lf", (double)(ans) / (double)((n - r + 1) * (m - r + 1)));
  return 0;
}
