#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const int N = 200005;
int n;
long long l[N], r[N], s[N];
struct fen {
  long long zi, mu;
  fen operator+(const fen rsh) {
    fen ret;
    ret.zi = (this->zi * rsh.mu + this->mu * rsh.zi) % MOD;
    ret.mu = (this->mu * rsh.mu) % MOD;
    return ret;
  }
  fen operator-(fen rsh) {
    rsh.zi = -rsh.zi;
    return *this + rsh;
  }
  fen operator*(const fen &rsh) {
    fen ret;
    ret.zi = (this->zi * rsh.zi) % MOD;
    ret.mu = (this->mu * rsh.mu) % MOD;
    return ret;
  }
} f[N], sum[N], ans;
long long Jiao(int i, int j) {
  return max(0LL, min(r[i], r[j]) - max(l[i], l[j]) + 1);
}
fen Next(int i) {
  if (i == n) return f[n - 1];
  long long a = (Jiao(i - 1, i) * s[i + 1]) % MOD;
  long long b = (Jiao(i, i + 1) * s[i - 1]) % MOD;
  long long c = min(min(Jiao(i - 1, i), Jiao(i, i + 1)), Jiao(i - 1, i + 1));
  long long mu = (((s[i - 1] * s[i]) % MOD) * s[i + 1]) % MOD;
  return (fen){mu - (a + b - c), mu};
}
long long Pow(long long x, long long p) {
  if (p == 0) return 1;
  if (p % 2 == 0) return Pow((x * x) % MOD, p / 2);
  return (x * Pow((x * x) % MOD, p / 2)) % MOD;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &l[i]);
  f[0] = sum[0] = (fen){0, 1};
  scanf("%lld", &r[1]), s[1] = r[1] - l[1] + 1;
  for (int i = 2; i <= n; i++) {
    scanf("%lld", &r[i]), s[i] = r[i] - l[i] + 1;
    long long mu = (long long)s[i - 1] * s[i];
    long long zi = mu - Jiao(i - 1, i);
    f[i - 1] = (fen){zi % MOD, mu % MOD};
    sum[i - 1] = sum[i - 2] + f[i - 1];
  }
  f[n] = (fen){1, 1}, sum[n] = sum[n - 1] + f[n];
  if (n == 1) {
    printf("1\n");
    return 0;
  }
  ans = (fen){0, 1};
  ans = ans + f[1] + Next(2) + f[1] * (sum[n] - sum[2]);
  for (int i = 2; i < n; i++) {
    ans = ans + f[i] + Next(i) + Next(i + 1);
    ans = ans + f[i] * (sum[i - 2] + sum[n] - sum[i + 1]);
  }
  ans = ans + f[n] + Next(n) + sum[n - 2];
  printf("%lld\n", (ans.zi * Pow(ans.mu, MOD - 2)) % MOD);
  return 0;
}
