#include <bits/stdc++.h>
using namespace std;
void solve();
int main() {
  solve();
  return 0;
}
struct Firm {
  long long w, c, a;
  double key;
  void updateKey(int i) { key = (double)(c - i * a) / (double)w; }
  bool operator<(const Firm& r) const { return key < r.key; }
};
Firm f[500000];
string getLL(long long v) {
  stringstream ss;
  ss << v;
  return ss.str();
}
unsigned long long _X = 0;
inline int nextRandInt() {
  _X = (1664525ULL * _X + 1013904223ULL);
  unsigned long long res = _X >> 32;
  return (int)(res & 0x7FFFFFFF);
}
void doSort(Firm* a, int left, int right, long long W) {
  if (right <= left) return;
  double pivot = a[left + ((nextRandInt() % (right - left)) >> 1)].key;
  int i = left, j = right;
  do {
    while (a[i].key < pivot) ++i;
    while (a[j].key > pivot) --j;
    if (i <= j) {
      if (i < j) swap(a[i], a[j]);
      ++i;
      --j;
    }
  } while (i <= j);
  long long sum = W;
  for (int p = left; p < i; p++) {
    if (sum >= 0) sum -= a[p].w;
  }
  if (sum > 0) {
    if (j < right) doSort(a, i, right, sum);
    return;
  }
  doSort(a, left, j, W);
}
void solve() {
  int n, m, W;
  scanf("%d%d%d", &n, &m, &W);
  for (int i = 0; i < m; i++) scanf("%lld", &f[i].w);
  for (int i = 0; i < m; i++) scanf("%lld", &f[i].c);
  for (int i = 0; i < m; i++) scanf("%lld", &f[i].a);
  double res = 0.0;
  long long ipart = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) f[j].updateKey(i);
    doSort(f, 0, m - 1, W);
    long long w = W;
    for (int j = 0; j < m && w > 0; j++) {
      if (w >= f[j].w) {
        ipart += (f[j].c - i * f[j].a);
        w -= f[j].w;
      } else {
        long long z = (f[j].c - i * f[j].a) * w;
        ipart += (z / f[j].w);
        res += (z % f[j].w + 0.0) / f[j].w;
        w = 0;
      }
    }
  }
  long long tmp = (long long)res;
  ipart += tmp;
  res -= tmp;
  char buf[100];
  sprintf(buf, "%.10lf\n", res);
  printf("%s", getLL(ipart).c_str());
  int t = 0;
  while (buf[t] != '.') ++t;
  while (buf[t]) printf("%c", buf[t++]);
}
