#include <bits/stdc++.h>
using namespace std;
int n, m, r, k;
long long tot;
double cev, alt;
map<pair<int, int>, int> used;
struct node {
  bool operator()(pair<int, int> x, pair<int, int> y) {
    long long c1 = 1ll * x.first * x.second;
    long long c2 = 1ll * y.first * y.second;
    return (c1 < c2);
  }
};
double carp(pair<int, int> x) { return 1.0 * x.first * x.second / alt; }
long long get(pair<int, int> x) {
  int rw = x.first;
  int cl = x.second;
  int totr, totc;
  if (rw < min(r, n - r + 1))
    totr = 2;
  else
    totr = n - 2 * min(r, n - r + 1) + 2;
  if (cl < min(r, m - r + 1))
    totc = 2;
  else
    totc = m - 2 * min(r, m - r + 1) + 2;
  return 1ll * totr * totc;
}
int main() {
  scanf("%d %d %d %d", &n, &m, &r, &k);
  alt = 1.0 * (n - r + 1) * (m - r + 1);
  priority_queue<pair<int, int>, vector<pair<int, int> >, node> q;
  q.push(make_pair(min(r, n - r + 1), min(r, m - r + 1)));
  while (!q.empty() && tot < k) {
    pair<int, int> x = q.top();
    q.pop();
    if (used[x]) continue;
    used[x] = 1;
    long long no = min(get(x), 1ll * k - tot);
    tot = tot + no;
    cev = cev + 1.0 * no * carp(x);
    if (x.first - 1 > 0) q.push(make_pair(x.first - 1, x.second));
    if (x.second - 1 > 0) q.push(make_pair(x.first, x.second - 1));
  }
  printf("%.12lf", cev);
}
