#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 9;
const int mod = 1e9 + 7;
int gcdExtended(long long a, long long b, long long *x, long long *y)
{
// Base Case
if (a == 0)
{
*x = 0, *y = 1;
return b;
}
long long x1, y1; // To store results of recursive call
long long gcd = gcdExtended(b%a, a, &x1, &y1);
// Update x and y using results of recursive
// call
*x = y1 - (b/a) * x1;
*y = x1;
return gcd;
}
long long modInverse(long long b , long long mod){
long long x , y;
long long d= gcdExtended(b , mod , &x , &y);
if(d != 1) return -1;
return (x%mod + mod ) % mod;
}
long long modDivide(long long a,long long b, long long m)
{
a = a % m;
long long inv = modInverse(b, m);
if (inv == -1)
return -1;
else
return (inv * a) % m;
}
long long fact[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n;
cin >> n;
int a[n] , b[n];
fact[0] = fact[1] = 1;
for(int i = 2; i < N; i++){
fact[i] = fact[i - 1] * i;
fact[i] %= mod;
}
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n; i++) cin >> b[i];
int arr[n];
long long sum = 0;
int test= 1;
for(int i = 0; i < n; i++){
arr[i] = (b[i] - a[i]) / ( i + 1 );
if((b[i] - a[i]) % ( i + 1 )) test = 0;
sum += arr[i];
}
if(!test){
cout << 0 << "\n";
return 0;
}
long long ans = fact[sum];
for(int i = 0; i < n; i++){
long long e = modDivide(ans, fact[arr[i]], mod);
if(e == -1){
test = 0;
break;
}else ans = e;
}
if(test == 0) ans = 0;
cout << ans << "\n";
return 0;
}
Copy