#include <bits/stdc++.h>
using namespace std;
const long double epsylon = 1e-9;
long long mod = 1000000007;
long long mem[10010][128];
long long comb[10010][128];
vector<long long> x;
vector<long long> y;
inline long long cb(int n, int k) {
  if (n >= k) {
    return comb[n][k];
  } else {
    return 0;
  }
}
long long solve(int from, long long left) {
  if (from >= x.size()) {
    if (left == 0) {
      return mem[left][from] = 1;
    } else {
      return mem[left][from] = 0;
    }
  }
  long long res = 0;
  long long c = left + x[from];
  for (long long j = 0; j <= c && j <= y[from]; j++) {
    long long t = ((mem[c - j][from + 1] == -1) ? solve(from + 1, c - j)
                                                : mem[c - j][from + 1]);
    t = (t * cb(c, j)) % mod;
    res = (res + t) % mod;
  }
  return mem[left][from] = res;
}
int main() {
  comb[0][0] = 1;
  for (int i = 1; i < 10010; i++) {
    comb[i][0] = 1;
    for (int j = 1; j < 128; j++) {
      comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % mod;
    }
  }
  memset(mem, -1, sizeof(mem));
  int n;
  cin >> n;
  x.resize(n);
  y.resize(n);
  long long sum = 0;
  for (int i = 0; i < n; i++) {
    cin >> x[i];
    sum += x[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> y[i];
  }
  long long res = 1;
  for (long long i = 0; i < n; i++) {
    res = (res * cb(sum, x[i])) % mod;
    sum -= x[i];
  }
  res = (res * solve(0, 0)) % mod;
  cout << res << endl;
  return 0;
}
