#include <bits/stdc++.h>
using namespace std;
int n, m, W;
int w[500000], c[500000], a[500000];
pair<double, int> cc[500000];
long double ans = 0;
long long dans = 0;
int rem;
unsigned long long MUL = 6364136223846793005ll;
unsigned long long ADD = 1442695040888963407ll;
unsigned long long randSeed = 1234567;
int myRand(int bound) {
  randSeed = MUL * randSeed + ADD;
  return (randSeed >> 32) % bound;
}
void getSome(int from, int to) {
  if (to - from == 1) {
    int ind = cc[from].second;
    long double cur = rem / (long double)w[ind];
    long long dcur = floor(cur);
    cur -= dcur;
    dans += dcur * c[ind];
    cur *= c[ind];
    long long tmp = floor(cur);
    dans += tmp;
    ans += cur - tmp;
    while (ans >= 1) {
      ans -= 1;
      ++dans;
    }
    return;
  }
  double mid = cc[from + myRand(to - from)].first;
  int l = from, r = to - 1;
  long long some = 0;
  while (l < r) {
    while (cc[l].first < mid) some += w[cc[l++].second];
    while (cc[r].first > mid) --r;
    if (l < r) {
      swap(cc[l], cc[r]);
      some += w[cc[l++].second];
      --r;
    }
  }
  if (l == r && cc[l].first < mid) {
    some += w[cc[l++].second];
  }
  if (some <= rem) {
    for (int i = from; i < l; ++i) {
      dans += c[cc[i].second];
      rem -= w[cc[i].second];
    }
    if (rem) {
      getSome(l, to);
    }
  } else {
    getSome(from, l);
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &W);
  for (int i = 0; i < (int)(m); ++i) scanf("%d", w + i);
  for (int i = 0; i < (int)(m); ++i) scanf("%d", c + i);
  for (int i = 0; i < (int)(m); ++i) scanf("%d", a + i);
  for (int i = 0; i < (int)(n); ++i) {
    for (int j = 0; j < (int)(m); ++j)
      cc[j] = make_pair(c[j] / (double)w[j], j);
    rem = W;
    getSome(0, m);
    if (i < n - 1) {
      for (int j = 0; j < (int)(m); ++j) c[j] -= a[j];
    }
  }
  ostringstream oss;
  oss << setprecision(15) << fixed << (double)ans;
  string s = oss.str();
  while (s[0] != '.') s.erase(0, 1);
  printf("%I64d%s", dans, s.c_str());
  return 0;
}
