#include <bits/stdc++.h>
using namespace std;
int n, a[110], b[110];
int F[1010], IF[1010];
int f[110][1010];
void gcd(int a, int b, int &x, int &y) {
  if (b == 0) {
    x = 1, y = 0;
    return;
  }
  gcd(b, a % b, y, x), y -= a / b * x;
}
int inv(int n) {
  int x, y;
  gcd(n, 1000000007, x, y);
  if (x < 0) x += 1000000007;
  return x;
}
int C(int n, int k) {
  return (long long)F[n] * IF[k] % 1000000007 * IF[n - k] % 1000000007;
}
int main() {
  F[0] = 1;
  for (int i = 1; i < 1010; i++) F[i] = (long long)F[i - 1] * i % 1000000007;
  IF[1010 - 1] = inv(F[1010 - 1]);
  for (int i = 1010 - 1; i; i--) IF[i - 1] = (long long)IF[i] * i % 1000000007;
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n; i++) cin >> b[i];
  f[0][0] = 1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < 1010; j++)
      if (f[i][j]) {
        for (int k = 0; k <= min(b[i], j + a[i]); k++) {
          (f[i + 1][j + a[i] - k] +=
           (long long)f[i][j] * C(j + a[i], k) % 1000000007) %= 1000000007;
        }
      }
  int S = f[n][0];
  S = (long long)S * F[accumulate(a, a + n, 0)] % 1000000007;
  for (int i = 0; i < n; i++) {
    S = (long long)S * IF[a[i]] % 1000000007;
  }
  cout << S << endl;
  return 0;
}
