#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 1000 + 10;
template <typename T>
bool chkmax(T& a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
bool chkmin(T& a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
T read() {
  T n(0), f(1);
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) n = n * 10 + ch - 48;
  return n * f;
}
int m;
long long s[maxn], x[maxn], y[maxn];
long long dp[maxn][maxn], c[maxn][maxn];
void init() {
  for (int i = 0; i < maxn; i++) {
    c[i][0] = c[i][i] = 1;
    for (int j = 1; j < i; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
  }
}
int main() {
  init();
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) s[i] = s[i - 1] + (x[i] = read<int>());
  for (int i = 1; i <= m; i++) y[i] = read<int>();
  long long p = 1, tmp = s[m];
  for (int i = 1; i <= m; i++) (p *= c[tmp][x[i]]) %= mod, tmp -= x[i];
  dp[0][0] = 1;
  for (int i = 0; i < m; i++) {
    for (int j = 0; j <= s[i]; j++)
      if (dp[i][j]) {
        for (int k = 0; k <= y[i + 1] && k <= s[i + 1] - j; k++)
          (dp[i + 1][j + k] += dp[i][j] * c[s[i + 1] - j][k] % mod) %= mod;
      }
  }
  printf("%lld\n", dp[m][s[m]] * p % mod);
  return 0;
}
