#include <cstdio>

#define KONJ 42 - 42
#define MAXN 100010
#define MOD 1000000007

using namespace std;

int N;
long long A[MAXN], B[MAXN];
long long memo[MAXN][2][2];
bool bio[MAXN][2][2];

long long rek( int curr, bool zel, bool dal ){

    long long sol = 0;

    if ( bio[curr][zel][dal] ){ return memo[curr][zel][dal]; }
    bio[curr][zel][dal] = true;
    
    if ( curr >= N ){ return memo[curr][zel][dal] = 1; }

    if ( !zel && !dal ){
         if ( curr == N - 1 ){ sol = A[curr] + B[curr] - 1; } else {
         sol = ( A[curr] + B[curr] - 1 ) * ( rek( curr + 1, 1, 0 ) + rek( curr + 1, 1, 1 ) ); }
    }
    
    if ( zel && !dal ){
         if ( curr == N - 1 ){ sol = A[curr] + B[curr]; } else {
         sol = ( A[curr] + B[curr] ) * ( rek( curr + 1, 1, 0 ) + rek( curr + 1, 1, 1 ) ); }
    }
    
    if ( !zel && dal ){
         if ( curr == N - 1 ){ sol =  B[curr + 1]; } else {
         sol = B[curr + 1] * ( rek( curr + 1, 0, 0 ) + rek( curr + 1, 0, 1 ) ); }
    }
    
    if ( zel && dal ){
         if ( curr == N - 1 ){ sol =  B[curr + 1]; } else {
         sol = B[curr + 1] * ( rek( curr + 1, 0, 0 ) + rek( curr + 1, 0, 1 ) ); }
    }

    return memo[curr][zel][dal] = sol % MOD;
    
}

int main( void ){

    scanf( "%d", &N );
    for ( int i = 0; i < N; ++i ){
        scanf( "%d", &A[i] );
    }
    
    for ( int i = 1; i < N; ++i ){
        scanf( "%d", &B[i] );
    }
    
    printf( "%lld\n", ( rek( 0, 1, 1 ) + rek( 0, 1, 0 ) ) % MOD );

    return KONJ;

}
