#include<iostream>
#define int long long
using namespace std;
const int maxn=300050;
const int mod=1000000007;
int n,m[maxn],a[maxn];
int val(int i,int k){
return (k<=m[i]-a[i])+(k<=a[i]-1);
}
int two[maxn],one[maxn];
void bisec(int i){
int l=0,r=m[i];
while(l<r){
if(r-l<=10)break;
int mid=(l+r)/2;
if(val(i,mid)==2)l=mid;
else r=mid-1;
}
for(int j=r;j>=l;j--){
if(val(i,j)==2){
two[i]=j;
return;
}
}
}
void bisec2(int i){
int l=0,r=m[i];
while(l<r){
if(r-l<=10)break;
int mid=(l+r)/2;
if(val(i,mid)>=1)l=mid;
else r=mid-1;
}
for(int j=r;j>=l;j--){
if(val(i,j)>=1){
one[i]=j;
return;
}
}
}
int find1(int k){
int ans=0;
for(int i=1;i<=n;i++){
if(two[i]<k&&k<=one[i])ans++;
}
return ans;
}
int maxtop=1e18;
int bisec3(int x){
int l=1,r=maxtop;
while(l<=r){
if(r-l<=10)break;
int mid=(l+r)/2;
if(find1(mid)>=x)r=mid-1;
else l=mid;
}
for(int i=l;i<=r;i++){
if(find1(i)==x){
return i;
}
}
return -1;
}
int bisec4(int x){
int l=1,r=maxtop;
while(l<=r){
if(r-l<=10)break;
int mid=(l+r)/2;
if(find1(mid)>x)r=mid-1;
else l=mid;
}
for(int i=r;i>=l;i--){
if(find1(i)==x){
return i;
}
}
return -1;
}
int qpow(int x,int y){
if(y==0)return 1;
if(y==1)return x%mod;
int c=qpow(x,y/2);
int ans=(c*c%mod)*(y%2?x:1)%mod;
return ans%mod;
}
int ans=0;
void deal(int x){
int l=bisec3(x),r=bisec4(x);
if(l==-1||r==-1)return;
ans+=qpow(2,n-x)*((r-l+1)%mod)%mod;
ans%=mod;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&m[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
bisec(i);
bisec2(i);
maxtop=min(maxtop,one[i]);
}
for(int i=0;i<=n;i++){
deal(i);
}
printf("%lld",(ans+1)%mod);
return 0;
}