#include <bits/stdc++.h>
using namespace std;
const long long MOD = (long long)1e9 + 7;
const int N = 105;
const int M = 5005;
long long dp[N][M];
int x[N];
int y[N];
long long c[M][N];
int sum[N];
int rSum[N];
int h[N];
int main() {
  int n, i, j, k, l;
  long long ans = 0;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &x[i]);
  }
  for (i = 1; i <= n; i++) {
    scanf("%d", &y[i]);
  }
  for (i = 0; i < M; i++) {
    c[i][0] = 1;
    if (i <= 100) {
      c[i][i] = 1;
    }
    for (j = 1; j < min(i, N); j++) {
      c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
    }
  }
  for (i = 1; i <= n; i++) {
    sum[i] = sum[i - 1] + x[i];
  }
  for (i = n; i >= 1; i--) {
    rSum[i] = rSum[i + 1] + y[i] - x[i];
  }
  for (i = 1; i <= n; i++) {
    h[i] = x[i] + min(sum[i - 1], rSum[i]);
  }
  for (j = x[n]; j <= y[n]; j++) {
    dp[n][j] = 1;
  }
  for (i = n - 1; i >= 1; i--) {
    for (j = x[i]; j <= h[i]; j++) {
      for (k = 0; k <= min(y[i], j); k++) {
        dp[i][j] = (dp[i][j] + c[j][k] * dp[i + 1][x[i + 1] + j - k]) % MOD;
      }
    }
  }
  ans = dp[1][x[1]];
  int num = sum[n];
  for (i = 1; i <= n; i++) {
    ans = (ans * c[num][x[i]]) % MOD;
    num -= x[i];
  }
  printf("%d\n", (int)ans);
}
