#include <bits/stdc++.h>
using namespace std;
long long N, M, R, K;
priority_queue<pair<long long, pair<long long, long long> > > Q;
long long ans = 0;
set<pair<long long, long long> > vis;
long long number(long long x, long long y) {
  long long ret = max(0LL, min(N - R + 1LL, x) - max(x - R + 1LL, 1LL) + 1);
  ret *= max(0LL, min(M - R + 1, y) - max(y - R + 1, 1LL) + 1LL) * 1LL;
  return ret;
}
long long dx[] = {-1LL, 0LL, 1LL, 0LL, 1, -1, -1, 1};
long long dy[] = {0LL, -1LL, 0LL, 1LL, 1, -1, 1, -1};
inline bool inRange(int x, int y) {
  return x >= 1 && x <= N && y >= 1 && y <= M;
}
void dfs(int x, int y, long long mul) {
  if (K <= 0) return;
  int i;
  vis.insert({x, y});
  --K;
  ans += mul;
  for (i = 0; i < 8; ++i) {
    if (inRange(x + dx[i], y + dy[i]) && mul == number(x + dx[i], y + dy[i]) &&
        vis.find({x + dx[i], y + dy[i]}) == vis.end())
      dfs(x + dx[i], y + dy[i], mul);
    else if (inRange(x + dx[i], y + dy[i]) &&
             mul > number(x + dx[i], y + dy[i]))
      Q.push({number(x + dx[i], y + dy[i]), {x + dx[i], y + dy[i]}});
  }
}
int main() {
  cin >> N >> M >> R >> K;
  Q.push({number(R, R), {R, R}});
  while (K > 0) {
    while (vis.find(Q.top().second) != vis.end()) Q.pop();
    dfs(Q.top().second.first, Q.top().second.second, Q.top().first);
    Q.pop();
  }
  cout.precision(11);
  long double denom = ((long long)(N - R + 1LL) * 1LL * (M - R + 1LL));
  ;
  long double an0 = ans;
  cout << fixed << an0 / denom;
  return 0;
}
