#include <bits/stdc++.h>
long long pw(long long a, long long b) {
  long long r;
  if (b == 0) return 1;
  r = pw(a, b / 2);
  r = (r * r) % 1000000007;
  if (b % 2) r = (r * a) % 1000000007;
  return r;
}
int X[120], Y[120], n;
long long fact[12000], facti[12000];
long long dp[120][12000];
long long comb[12000][120];
long long people[120], cap[120];
long long solve(int st, int rest) {
  int i, j, k, mx;
  long long res = 0;
  if (rest < 0) return 0;
  if (dp[st][rest] >= 0) return dp[st][rest];
  if (st == n) {
    if (rest == 0) res++;
    return dp[st][rest] = res;
  }
  if (rest + (people[n] - people[st]) - (cap[n] - cap[st]) > 0) {
    return dp[st][rest] = 0;
  }
  mx = Y[st];
  if (rest + X[st] < mx) mx = rest + X[st];
  for (i = 0; i < mx + 1; i++) {
    res += solve(st + 1, rest + X[st] - i) * comb[rest + X[st]][i];
    res %= 1000000007;
  }
  return dp[st][rest] = res;
}
int main() {
  int i, j, k, l, m;
  long long res, sum;
  fact[0] = 1;
  for (i = 1; i < 12000; i++) fact[i] = (fact[i - 1] * i) % 1000000007;
  for (i = 0; i < 12000; i++) facti[i] = pw(fact[i], 1000000007 - 2);
  comb[0][0] = 1;
  for (j = 1; j < 120; j++) comb[0][j] = 0;
  for (i = 1; i < 12000; i++) {
    comb[i][0] = 1;
    for (j = 1; j < 120; j++)
      comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % 1000000007;
  }
  scanf("%d", &n);
  for (i = 0; i < n; i++) scanf("%d", X + i);
  for (i = 0; i < n; i++) scanf("%d", Y + i);
  sum = 0;
  for (i = 0; i < n; i++) sum += X[i];
  people[0] = 0;
  for (i = 0; i < n; i++) people[i + 1] = people[i] + X[i];
  cap[0] = 0;
  for (i = 0; i < n; i++) cap[i + 1] = cap[i] + Y[i];
  for (i = 0; i < n + 1; i++)
    for (j = 0; j < sum + 1; j++) dp[i][j] = -1;
  res = solve(0, 0);
  res = (res * fact[sum]) % 1000000007;
  for (i = 0; i < n; i++) res = (res * facti[X[i]]) % 1000000007;
  printf("%d\n", (int)res);
  return 0;
}
