#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
const int N = 200005;
long long n, m, r, k, ans;
struct Node {
  long long num, x, y;
  bool friend operator<(Node a, Node b) { return a.num < b.num; }
};
map<pair<long long, long long>, int> mp;
priority_queue<Node> q;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool check(long long x, long long y) {
  return x > 0 && x <= n && y > 0 && y <= m;
}
long long get(long long x, long long y) {
  return abs(min(n, x + r - 1) - max(r, x) + 1) *
         abs(min(y, m - r + 1) - max(y - r + 1, 1LL) + 1);
}
void bfs(Node u) {
  long long tx, ty;
  for (int i = 0; i <= 3; ++i) {
    tx = u.x + dx[i], ty = u.y + dy[i];
    if (check(tx, ty) && mp.find(make_pair(tx, ty)) == mp.end())
      q.push((Node){get(tx, ty), tx, ty}), mp[make_pair(tx, ty)] = 1;
  }
}
int main() {
  scanf("%lld%lld%lld%llld", &n, &m, &r, &k);
  q.push((Node){get(n - r + 1, r), n - r + 1, r});
  mp[make_pair(n - r + 1, r)] = 1;
  long long cnt = 0;
  Node u;
  while (cnt < k) {
    u = q.top();
    q.pop();
    bfs(u);
    ans += u.num;
    ++cnt;
  }
  printf("%.9f\n", 1.0 * ans / (n - r + 1) / (m - r + 1));
  return 0;
}
