Problem: The New Year celebrations in Berland last n days. Only this year the winter is snowless, that’s why the winter celebrations’ organizers should buy artificial snow. There are m snow selling companies in Berland. Every day the i-th company produces wi cubic meters of snow. Next day the snow thaws and the company has to produce wi cubic meters of snow again. During the celebration new year discounts are on, that’s why the snow cost decreases every day. It is known that on the first day the total cost of all the snow produced by the i-th company is equal to ci bourles. Every day this total cost decreases by ai bourles, i.e. on the second day it is equal to ci - ai,and on the third day — to ci - 2ai, and so on. It is known that for one company the cost of the snow produced by it does not get negative or equal to zero. You have to organize the snow purchase so as to buy every day exactly W snow cubic meters. At that it is not necessary to buy from any company all the snow produced by it. If you buy ni cubic meters of snow (0 ≤ ni ≤ wi, the number ni is not necessarily integer!) from the i-th company at one of the days when the cost of its snow is equal to si, then its price will total to <image> bourles. During one day one can buy the snow from several companies. In different days one can buy the snow from different companies. It is required to make the purchases so as to spend as little money as possible. It is guaranteed that the snow produced by the companies will be enough.

Input

The first line contains integers n, m and W (1 ≤ n ≤ 100, 1 ≤ m ≤ 500000, 1 ≤ W ≤ 109) which represent the number of days, the number of companies and the amount of snow that needs to be purchased on every one of the n days. The second line contains m integers wi. The third line contains m integers ci. The fourth line contains m integers ai. All the numbers are strictly positive and do not exceed 109. For all the i the inequation ci - (n - 1)ai > 0 holds true. 

Output

Print a single number — the answer to the given problem. Print the answer in the format with the decimal point (even if the answer is integer, it must contain the decimal point), without "e" and without leading zeroes. The answer should differ with the right one by no more than 10 - 9.

Examples

Input

2 3 10
4 4 4
5 5 8
1 2 5


Output

22.000000000000000


Input

100 2 1000000000
999999998 999999999
1000000000 1000000000
1 1


Output

99999995149.999995249999991

Solution (in CPP):

Solution:
#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;
}