#include <bits/stdc++.h>
using namespace std;
int M;
int total;
int X[200];
int Y[200];
long long c[2000][2000];
long long f[200][2000];
bool caled[200][2000];
const long long moder = 1000000007;
long long getF(int nowPosi, int remain) {
  if (nowPosi == M) {
    if (remain == 0)
      return 1;
    else
      return 0;
  }
  if (caled[nowPosi][remain]) return f[nowPosi][remain];
  caled[nowPosi][remain] = true;
  long long& ret = f[nowPosi][remain];
  ret = 0;
  int candidateFirst = 0;
  for (int i = nowPosi; i < M; ++i) candidateFirst += X[i];
  int candidateSecond = 0;
  for (int i = 0; i <= nowPosi; ++i) candidateSecond += X[i];
  int selected = total - remain;
  candidateSecond -= selected;
  if (candidateSecond < 0) candidateSecond = 0;
  int maxSelected = min(remain, Y[nowPosi]);
  for (int i = 0; i <= maxSelected; ++i) {
    long long c1 = c[candidateFirst][X[nowPosi]];
    long long c2 = c[candidateSecond][i];
    long long tmp = c1 * c2 % moder;
    ret += tmp * getF(nowPosi + 1, remain - i);
    ret %= moder;
  }
  return ret;
}
void deal() {
  memset(caled, false, sizeof(caled));
  total = 0;
  for (int i = 0; i < M; ++i) total += X[i];
  cout << getF(0, total) << endl;
}
void init() {
  scanf("%d", &M);
  for (int i = 0; i < M; ++i) scanf("%d", &X[i]);
  for (int i = 0; i < M; ++i) scanf("%d", &Y[i]);
  memset(c, 0, sizeof(c));
  c[0][0] = 1;
  c[1][0] = 1;
  c[1][1] = 1;
  for (int i = 2; i <= 1000; ++i) {
    c[i][0] = 1;
    c[i][i] = 1;
    for (int j = 1; j < i; ++j)
      c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % moder;
  }
}
int main() {
  init();
  deal();
  return 0;
}
