#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T>
inline bool uin(T &a, T b) {
  return a > b && (a = b, true);
}
template <class T>
inline bool uax(T &a, T b) {
  return a < b && (a = b, true);
}
class DFishes {
 public:
  void solve(std::istream &cin, std::ostream &cout) {
    int n, m, r, k;
    cin >> n >> m >> r >> k;
    auto cnt = [&](int x, int y) -> ll {
      ll low_x = max(1, x - r + 1);
      ll low_y = max(1, y - r + 1);
      return (min(x, n - r + 1) - low_x + 1LL) *
             (min(y, m - r + 1) - low_y + 1LL);
    };
    auto in = [&](int x, int y) -> bool {
      return (x > 0 && x <= n && y > 0 && y <= m);
    };
    const int dx[4] = {-1, 1, 0, 0};
    const int dy[4] = {0, 0, -1, 1};
    using state = tuple<ll, int, int>;
    priority_queue<state> heap;
    heap.emplace(cnt((n + 1) / 2, (m + 1) / 2), (n + 1) / 2, (m + 1) / 2);
    int assign = 0;
    map<pair<int, int>, ll> score;
    score[make_pair((n + 1) / 2, (m + 1) / 2)] = cnt((n + 1) / 2, (m + 1) / 2);
    ll total_score = 0;
    while (!heap.empty() && assign < k) {
      auto [val, x, y] = heap.top();
      heap.pop();
      if (score[make_pair(x, y)] != val) continue;
      ++assign;
      total_score += val;
      for (int i = 0; i < 4; ++i) {
        int xx = x + dx[i], yy = y + dy[i];
        if (!in(xx, yy) || score[make_pair(xx, yy)]) continue;
        ll val_ch = cnt(xx, yy);
        heap.emplace(val_ch, xx, yy);
        score[make_pair(xx, yy)] = val_ch;
      }
    }
    ll total_sq = (n - r + 1) * 1LL * (m - r + 1);
    auto tot_scoreld = (long double)total_score;
    auto tot_sqld = (long double)total_sq;
    long double ev = tot_scoreld / tot_sqld;
    cout << setprecision(10) << fixed << ev << '\n';
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  DFishes solver;
  std::istream &in(std::cin);
  std::ostream &out(std::cout);
  solver.solve(in, out);
  return 0;
}
