#include <bits/stdc++.h>
using namespace std;
long long n, m, r, k, tot;
int dx[] = {0, -1, 0, 1};
int dy[] = {-1, 0, 1, 0};
struct Cell {
  long long c, x, y;
  bool operator<(const Cell &oth) const { return c < oth.c; }
};
class Map {
 private:
  set<long long> vis;

 public:
  bool isVisit(long long x, long long y) {
    return vis.count((x - 1) * m + y - 1);
  }
  void setVisit(long long x, long long y) { vis.insert((x - 1) * m + y - 1); }
} mp;
long long calc(long long x, long long y) {
  return min(r, min(n - r + 1, min(x, n - x + 1))) *
         min(r, min(m - r + 1, min(y, m - y + 1)));
}
priority_queue<Cell> pq;
void solve() {
  scanf("%lld%lld%lld%lld", &n, &m, &r, &k);
  pq.push({calc(r, r), r, r});
  mp.setVisit(r, r);
  while (!pq.empty() && k) {
    Cell cur = pq.top();
    pq.pop();
    k--;
    tot += cur.c;
    for (int i = 0; i < 4; i++) {
      int nx = cur.x + dx[i], ny = cur.y + dy[i];
      if (0 < nx && nx <= n && 0 < ny && ny <= m && !mp.isVisit(nx, ny)) {
        pq.push({calc(nx, ny), nx, ny});
        mp.setVisit(nx, ny);
      }
    }
  }
  printf("%.10f\n", 1.0 * tot / (1.0 * (n - r + 1) * (m - r + 1)));
}
int main() {
  solve();
  return 0;
}
