#include <bits/stdc++.h>
using namespace std;
void Read(long long &x, char c = getchar(), bool f = 0) {
  for (x = 0; !isdigit(c); c = getchar())
    if (c == '-') f = 1;
  for (; isdigit(c); c = getchar()) x = 10 * x + c - '0';
  if (f) x = -x;
}
const long long maxn = 105, maxs = 1005, modd = 1e9 + 7;
long long n, m, a[maxn], b[maxn], f[maxn][maxs];
long long fac[maxs], inv[maxs];
long long Qpow(long long a, long long b) {
  long long rec = 1;
  for (; b; b >>= 1, (a *= a) %= modd)
    if (b & 1) (rec *= a) %= modd;
  return rec;
}
void init() {
  long long i, j;
  fac[0] = 1;
  for (i = 1; i < maxs; i++) fac[i] = fac[i - 1] * i % modd;
  inv[maxs - 1] = Qpow(fac[maxs - 1], modd - 2);
  for (i = maxs - 1; i; i--) inv[i - 1] = inv[i] * i % modd;
}
long long C(long long a, long long b) {
  long long rec = fac[a];
  (rec *= inv[b]) %= modd;
  (rec *= inv[a - b]) %= modd;
  return rec;
}
int main() {
  long long i, j, k, rec = 0;
  init();
  Read(n);
  for (i = 1; i <= n; i++) Read(a[i]);
  for (i = 1; i <= n; i++) Read(b[i]);
  f[0][0] = 1;
  for (i = 1; i <= n; i++) {
    rec += a[i];
    for (j = 0; j <= rec; j++)
      for (k = 0; k <= b[i]; k++)
        if (j + a[i] >= k)
          (f[i][j + a[i] - k] += f[i - 1][j] * C(j + a[i], k) % modd) %= modd;
  }
  rec = fac[rec];
  for (i = 1; i <= n; i++) (rec *= inv[a[i]]) %= modd;
  printf("%I64d\n", rec * f[n][0] % modd);
  return 0;
}
