#include <bits/stdc++.h>
using namespace std;
const int maxint = -1u >> 1;
const double eps = 1e-9;
int d[][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
struct Node {
  int x, y;
  long long p;
  Node() {}
  Node(long long _p, int _x, int _y) : p(_p), x(_x), y(_y) {}
  bool operator<(const Node& a) const { return p < a.p; }
};
long long get_nb(int tx, int ty, int r, int n, int m) {
  int x = min(tx, n - r) - max(0, tx - r + 1) + 1;
  int y = min(ty, m - r) - max(0, ty - r + 1) + 1;
  x = max(0, x);
  y = max(0, y);
  return (long long)x * (long long)y;
}
bool out(int x, int y, int n, int m) {
  return x < 0 || x >= n || y < 0 || y >= m;
}
bool find(map<pair<int, int>, bool>& mp, int tx, int ty) {
  pair<int, int> pp(tx, ty);
  map<pair<int, int>, bool>::iterator it = mp.find(pp);
  if (it == mp.end()) {
    mp[pp] = true;
    return false;
  }
  return true;
}
int main() {
  int n, m, r, k;
  while (scanf("%d%d%d%d", &n, &m, &r, &k) == 4) {
    long long tot_rec = (long long)(n - r + 1) * (m - r + 1);
    long long tot_fish = 0;
    map<pair<int, int>, bool> mp;
    priority_queue<Node> que;
    int tx = n / 2, ty = m / 2;
    Node pos(get_nb(tx, ty, r, n, m), tx, ty);
    mp[make_pair(tx, ty)] = true;
    que.push(pos);
    for (int i = 0; i < k; ++i) {
      Node tp = que.top();
      que.pop();
      int x = tp.x, y = tp.y;
      tot_fish += tp.p;
      for (int j = 0; j < 4; ++j) {
        tx = x + d[j][0];
        ty = y + d[j][1];
        if (out(tx, ty, n, m) || find(mp, tx, ty)) continue;
        long long nb = get_nb(tx, ty, r, n, m);
        Node pp(nb, tx, ty);
        que.push(pp);
      }
    }
    printf("%.10f\n", 1.0 * tot_fish / tot_rec);
  }
  return 0;
}
