#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
struct Node {
  int x, y;
  double z;
  friend bool operator<(const Node &a, const Node &b) { return a.z < b.z; }
};
int n, m, r, k;
double ans = 0;
priority_queue<Node> q;
map<pair<int, int>, int> ma;
inline bool Check(int x, int y) {
  return x >= 1 && x <= n && y >= 1 && y <= m && ma.count(make_pair(x, y)) == 0;
}
inline double Solve(int x, int y) {
  double x1 = min(1.00 * x, n - x + 1.00);
  x1 = min(x1, n - 1.00 * r + 1);
  x1 = min(x1, 1.00 * r);
  double y1 = min(1.00 * y, m - y + 1.00);
  y1 = min(y1, m - 1.00 * r + 1);
  y1 = min(y1, 1.00 * r);
  return x1 * y1 / 1.00 / (n - r + 1) / (m - r + 1);
}
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &k);
  q.push({r, r, Solve(r, r)});
  ma[make_pair(r, r)] = 1;
  while (k--) {
    Node now = q.top();
    int x = now.x, y = now.y;
    double z = now.z;
    ans += z;
    q.pop();
    for (int i = 0; i <= 3; i++) {
      int nx = x + dx[i], ny = y + dy[i];
      if (Check(nx, ny)) {
        ma[make_pair(nx, ny)] = 1;
        q.push({nx, ny, Solve(nx, ny)});
      }
    }
  }
  printf("%.9lf\n", ans);
  return 0;
}
