#include <bits/stdc++.h>
using namespace std;
template <class T>
void show(T a, int n) {
  for (int i = 0; i < n; ++i) cout << a[i] << ' ';
  cout << endl;
}
template <class T>
void show(T a, int r, int l) {
  for (int i = 0; i < r; ++i) show(a[i], l);
  cout << endl;
}
const int N = 128;
const int M = 500010;
const int oo = 10000 * 10000 * 10;
struct Node {
  double p;
  int w;
  int c;
  int a;
} com[M];
int n, m;
int w;
void qsort(int lf, int ri, int w) {
  int i, j, k;
  if (w <= 0 || lf >= ri) return;
  i = lf, j = ri;
  double pivot = (com[i].p + com[j].p) * 0.5;
  while (i <= j) {
    while (i <= ri && com[i].p < pivot) ++i;
    while (j >= lf && com[j].p > pivot) --j;
    if (i <= j) {
      swap(com[i], com[j]);
      ++i, --j;
    }
  }
  long long sum = 0;
  for (k = lf; k < i; ++k) {
    sum += com[k].w;
  }
  if (sum >= w) {
    qsort(lf, j, w);
  } else {
    qsort(i, ri, w - sum);
  }
}
void show() {
  int i;
  for (i = 0; i < m; ++i) {
    printf("%0.3f %d %d %d\n", com[i].p, com[i].w, com[i].c, com[i].a);
  }
}
char buf[100];
int main() {
  int i, j, cas = 0;
  scanf("%d %d %d", &n, &m, &w);
  for (i = 0; i < m; ++i) scanf("%d", &com[i].w);
  for (i = 0; i < m; ++i) scanf("%d", &com[i].c);
  for (i = 0; i < m; ++i) scanf("%d", &com[i].a);
  for (i = 0; i < m; ++i) com[i].p = (double)com[i].c / com[i].w;
  long long ip = 0;
  double dp = 0.0;
  for (i = 0; i < n; ++i) {
    qsort(0, m - 1, w);
    int res = w;
    for (j = 0; j < m; ++j) {
      if (com[j].w <= res) {
        res -= com[j].w;
        ip += com[j].c - i * com[j].a;
      } else {
        long long tmp = (long long)res * (com[j].c - i * com[j].a);
        ip += tmp / com[j].w;
        dp += (double)(tmp % com[j].w) / com[j].w;
        break;
      }
    }
    for (j = 0; j < m; ++j) com[j].p -= (double)com[j].a / com[j].w;
  }
  int tmp = (int)dp;
  ip += tmp;
  dp -= tmp;
  sprintf(buf, "%.15f\n", dp);
  printf("%lld", ip);
  i = 0;
  while (buf[i] != '.') ++i;
  while (buf[i]) printf("%c", buf[i++]);
  return 0;
}
