Problem: One must train much to do well on wizardry contests. So, there are numerous wizardry schools and magic fees.

One of such magic schools consists of n tours. A winner of each tour gets a huge prize. The school is organised quite far away, so one will have to take all the prizes home in one go. And the bags that you've brought with you have space for no more than k huge prizes.

Besides the fact that you want to take all the prizes home, you also want to perform well. You will consider your performance good if you win at least l tours.

In fact, years of organizing contests proved to the organizers that transporting huge prizes is an issue for the participants. Alas, no one has ever invented a spell that would shrink the prizes... So, here's the solution: for some tours the winner gets a bag instead of a huge prize. Each bag is characterized by number ai — the number of huge prizes that will fit into it.

You already know the subject of all tours, so you can estimate the probability pi of winning the i-th tour. You cannot skip the tour under any circumstances.

Find the probability that you will perform well on the contest and will be able to take all won prizes home (that is, that you will be able to fit all the huge prizes that you won into the bags that you either won or brought from home).

Input

The first line contains three integers n, l, k (1 ≤ n ≤ 200, 0 ≤ l, k ≤ 200) — the number of tours, the minimum number of tours to win, and the number of prizes that you can fit in the bags brought from home, correspondingly.

The second line contains n space-separated integers, pi (0 ≤ pi ≤ 100) — the probability to win the i-th tour, in percents.

The third line contains n space-separated integers, ai (1 ≤ ai ≤ 200) — the capacity of the bag that will be awarded to you for winning the i-th tour, or else -1, if the prize for the i-th tour is a huge prize and not a bag.

Output

Print a single real number — the answer to the problem. The answer will be accepted if the absolute or relative error does not exceed 10 - 6.

Examples

Input

3 1 0
10 20 30
-1 -1 2


Output

0.300000000000


Input

1 1 1
100
123


Output

1.000000000000

Note

In the first sample we need either win no tour or win the third one. If we win nothing we wouldn't perform well. So, we must to win the third tour. Other conditions will be satisfied in this case. Probability of wining the third tour is 0.3.

In the second sample we win the only tour with probability 1.0, and go back home with bag for it.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};
template <typename T, size_t N>
int SIZE(const T (&t)[N]) {
  return N;
}
template <typename T>
int SIZE(const T &t) {
  return t.size();
}
string to_string(const string s, int x1 = 0, int x2 = 1e9) {
  return '"' + ((x1 < s.size()) ? s.substr(x1, x2 - x1 + 1) : "") + '"';
}
string to_string(const char *s) { return to_string((string)s); }
string to_string(const bool b) { return (b ? "true" : "false"); }
string to_string(const char c) { return string({c}); }
template <size_t N>
string to_string(const bitset<N> &b, int x1 = 0, int x2 = 1e9) {
  string t = "";
  for (int __iii__ = min(x1, SIZE(b)), __jjj__ = min(x2, SIZE(b) - 1);
       __iii__ <= __jjj__; ++__iii__) {
    t += b[__iii__] + '0';
  }
  return '"' + t + '"';
}
template <typename A, typename... C>
string to_string(const A(&v), int x1 = 0, int x2 = 1e9, C... coords);
int l_v_l_v_l = 0, t_a_b_s = 0;
template <typename A, typename B>
string to_string(const pair<A, B> &p) {
  l_v_l_v_l++;
  string res = "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
  l_v_l_v_l--;
  return res;
}
template <typename A, typename... C>
string to_string(const A(&v), int x1, int x2, C... coords) {
  int rnk = rank<A>::value;
  string tab(t_a_b_s, ' ');
  string res = "";
  bool first = true;
  if (l_v_l_v_l == 0) res += '\n';
  res += tab + "[";
  x1 = min(x1, SIZE(v)), x2 = min(x2, SIZE(v));
  auto l = begin(v);
  advance(l, x1);
  auto r = l;
  advance(r, (x2 - x1) + (x2 < SIZE(v)));
  for (auto e = l; e != r; e = next(e)) {
    if (!first) {
      res += ", ";
    }
    first = false;
    l_v_l_v_l++;
    if (e != l) {
      if (rnk > 1) {
        res += '\n';
        t_a_b_s = l_v_l_v_l;
      };
    } else {
      t_a_b_s = 0;
    }
    res += to_string(*e, coords...);
    l_v_l_v_l--;
  }
  res += "]";
  if (l_v_l_v_l == 0) res += '\n';
  return res;
}
void dbgm() { ; }
template <typename Heads, typename... Tails>
void dbgm(Heads H, Tails... T) {
  cout << to_string(H) << " | ";
  dbgm(T...);
}
const long long MOD = (int)1e9 + 7;
const long long INF = 2e18 + 5;
struct hashLL {
  size_t operator()(long long x) const {
    x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
    x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
    x = x ^ (x >> 31);
    return x;
  }
};
long long inv(long long a, long long b) {
  return 1 < a ? b - inv(b % a, a) * b / a : 1;
}
long long gcd(long long a, long long b, long long &x, long long &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long d = gcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
long long distsq(long long x1, long long y1, long long x2, long long y2) {
  return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
}
long long n, l, k;
vector<double> bagProb;
vector<long long> bagSize;
vector<double> prizeProb;
const int N = 201;
long long parr[N];
long long prize[N];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> l >> k;
  for (int i = 0; i < (n); i++) {
    cin >> parr[i];
  }
  for (int i = 0; i < (n); i++) cin >> prize[i];
  for (int i = 0; i < (n); i++) {
    if (prize[i] != -1) {
      bagProb.push_back(parr[i] / 100.0);
      bagSize.push_back(prize[i]);
    } else {
      prizeProb.push_back(parr[i] / 100.0);
    }
  }
  long long m = prizeProb.size();
  double dp[N];
  memset(dp, 0, sizeof(dp));
  dp[0] = 1.0;
  for (int i = 0; i < (m); i++) {
    for (int numWins = i + 1; numWins >= 0; numWins--) {
      dp[numWins] = dp[numWins] * (1.0 - prizeProb[i]);
      if (numWins > 0) dp[numWins] += dp[numWins - 1] * prizeProb[i];
    }
  }
  for (int i = 1; i <= (200); i++) dp[i] += dp[i - 1];
  double bagdp[N][N];
  bagdp[0][k] = 1;
  m = bagProb.size();
  for (int i = 0; i < (m); i++) {
    long long bagsz = bagSize[i];
    double pr = bagProb[i];
    double newbagdp[N][N];
    memset(newbagdp, 0, sizeof(newbagdp));
    for (int numWins = 200; numWins >= 0; numWins--) {
      int lowBagSz = max(0LL, 200 - bagsz);
      while (lowBagSz <= 200) {
        if (numWins > 0) {
          newbagdp[numWins][200] += bagdp[numWins - 1][lowBagSz] * pr;
        }
        lowBagSz++;
      }
      newbagdp[numWins][200] += bagdp[numWins][200] * (1 - pr);
      for (int bagSz = 199; bagSz >= k; bagSz--) {
        newbagdp[numWins][bagSz] = bagdp[numWins][bagSz] * (1 - pr);
        if (numWins > 0 && bagSz - bagsz >= 0) {
          newbagdp[numWins][bagSz] += bagdp[numWins - 1][bagSz - bagsz] * pr;
        }
      }
    }
    for (int j = 0; j <= 200; j++)
      for (int k = 0; k <= 200; k++) {
        bagdp[j][k] = newbagdp[j][k];
      }
  }
  double ans = 0;
  for (int bagWins = 0; bagWins <= 200; bagWins++) {
    for (int availBags = k; availBags <= 200; availBags++) {
      double bagpr = bagdp[bagWins][availBags];
      int neededWins = l - bagWins;
      if (availBags < neededWins) continue;
      double prizepr = 0.0;
      if (neededWins - 1 >= 0)
        prizepr = dp[availBags] - dp[neededWins - 1];
      else
        prizepr = dp[availBags];
      ans += bagpr * prizepr;
    }
  }
  cout << fixed << setprecision(12) << ans;
  return 0;
}