#include <bits/stdc++.h>
using namespace std;
long long n, m, r, k;
double ans;
map<pair<long long, long long>, long long> book;
struct Node {
  long long x, y;
  double val;
  Node(long long x, long long y, double val) : x(x), y(y), val(val) {}
  bool operator<(const Node &a) const { return this->val < a.val; }
};
double get_val(long long x, long long 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));
  double ret = (xx * yy) / (n - r + 1) / (m - r + 1);
  return ret;
}
priority_queue<Node> que;
long long Next[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m >> r >> k;
  que.push({n - r + 1, m - r + 1, get_val(n - r + 1, m - r + 1)});
  book[make_pair(n - r + 1, m - r + 1)] = 1;
  while (k--) {
    Node tp = que.top();
    que.pop();
    ans += tp.val;
    for (long long i = 0; i < 4; i++) {
      long long xx = tp.x + Next[i][0];
      long long yy = tp.y + Next[i][1];
      if (book.count(make_pair(xx, yy)) == 0 && xx >= 1 && yy >= 1 && xx <= n &&
          yy <= m) {
        que.push({xx, yy, get_val(xx, yy)});
        book[make_pair(xx, yy)] = 1;
      }
    }
  }
  printf("%.10lf\n", ans);
  return 0;
}
