#include <bits/stdc++.h>
using namespace std;
long long n, m, r, k;
struct cell {
  long long x, y;
  long long val;
  cell(long long x, long long y) : x(x), y(y) {
    val = (min(x + r, n + 1) - max(r, x)) * (min(y + r, m + 1) - max(r, y));
  }
};
class comp {
 public:
  bool operator()(const cell& a, const cell& b) { return a.val < b.val; }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long TESTS = 1;
  while (TESTS--) {
    cin >> n >> m >> r >> k;
    priority_queue<cell, vector<cell>, comp> p;
    int x = (n + 1) / 2, y = (m + 1) / 2;
    int c = 0;
    long long total = 0;
    set<pair<int, int> > used;
    p.push({x, y});
    used.insert({x, y});
    while (c < k) {
      cell mc = p.top();
      p.pop();
      total += mc.val;
      c++;
      if (mc.x > 1 && used.find({mc.x - 1, mc.y}) == used.end()) {
        used.insert({mc.x - 1, mc.y});
        p.push({mc.x - 1, mc.y});
      }
      if (mc.x < n && used.find({mc.x + 1, mc.y}) == used.end()) {
        used.insert({mc.x + 1, mc.y});
        p.push({mc.x + 1, mc.y});
      }
      if (mc.y > 1 && used.find({mc.x, mc.y - 1}) == used.end()) {
        used.insert({mc.x, mc.y - 1});
        p.push({mc.x, mc.y - 1});
      }
      if (mc.y < m && used.find({mc.x, mc.y + 1}) == used.end()) {
        used.insert({mc.x, mc.y + 1});
        p.push({mc.x, mc.y + 1});
      }
    }
    cout << setprecision(10);
    cout << (double)((double)total / (double)((n - r + 1) * (m - r + 1)));
  }
  return 0;
}
