#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, 1, -1};
int n, m, r, k;
bool check(int first, int second) {
  return first > 0 && first <= n && second > 0 && second <= m;
}
struct P {
  int first, second;
  long long val;
  bool operator<(const P& rhs) const { return val < rhs.val; }
};
priority_queue<P> pq;
map<pair<int, int>, int> mp;
long long cal(int first, int second) {
  return 1ll * (min(n + 1, first + r) - max(first, r)) *
         (min(m + 1, second + r) - max(second, r));
}
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &k);
  long long tot = 1ll * (n - r + 1) * (m - r + 1);
  long long ans = 0;
  int a = (n + 1) / 2, b = (m + 1) / 2;
  P st = {a, b, cal(a, b)};
  mp[pair<int, int>(a, b)] = 1;
  pq.push(st);
  for (int i = 0; i < k; i++) {
    P t = pq.top();
    pq.pop();
    pair<int, int> node = pair<int, int>(t.first, t.second);
    ans += cal(t.first, t.second);
    for (int j = 0; j < 4; j++) {
      int first = t.first + dx[j], second = t.second + dy[j];
      if (!check(first, second) ||
          mp.find(pair<int, int>(first, second)) != mp.end())
        continue;
      pq.push({first, second, cal(first, second)});
      mp[pair<int, int>(first, second)] = 1;
    }
  }
  printf("%.10f\n", (double)ans / (double)tot);
  return 0;
}
