#include <bits/stdc++.h>
using namespace std;
const int N = 100005, M = 350;
mt19937 gen(time(NULL));
template <typename T = int>
inline T read() {
  T val = 0, sign = 1;
  char ch;
  for (ch = getchar(); ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') sign = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) val = val * 10 + ch - '0';
  return sign * val;
}
int n, m, r, k;
long long get(int x, int y) {
  return (min(n + 1, x + r) - max(x, r)) * 1LL *
         (min(m + 1, y + r) - max(y, r));
}
bool ok(int x, int y) { return min(x, y) > 0 && x <= n && y <= m; }
struct cmp {
  bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
    long long f_a = get(a.first, a.second);
    long long f_b = get(b.first, b.second);
    return f_a > f_b || (f_a == f_b && a > b);
  }
};
set<pair<int, int>, cmp> s;
set<int> used[N];
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};
double get() {
  s.insert(make_pair((n + 1) / 2, (m + 1) / 2));
  used[(n + 1) / 2].insert((m + 1) / 2);
  long long total = 0;
  for (int i = 0; i < k; i++) {
    auto e = *s.begin();
    s.erase(s.begin());
    int x = e.first, y = e.second;
    total += get(x, y);
    for (int j = 0; j < 4; j++) {
      int nx = x + dx[j], ny = y + dy[j];
      if (!ok(nx, ny) || used[nx].count(ny)) continue;
      s.insert(make_pair(nx, ny));
      used[nx].insert(ny);
    }
  }
  return (double)total / ((n - r + 1) * 1LL * (m - r + 1));
}
void solve() {
  n = read(), m = read(), r = read(), k = read();
  if (n > m) swap(n, m);
  if (n == 1 && m == 1)
    printf("%.10f\n", 1.0);
  else
    printf("%.10f\n", get());
}
signed main() {
  int t = 1;
  while (t--) {
    clock_t z = clock();
    solve();
    fprintf(stderr, "Elapsed Time: %.3f\n",
            (double)(clock() - z) / CLOCKS_PER_SEC),
        fflush(stderr);
  }
}
