我不太擅长dfs,比赛时乱写了一通,只得了16分
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long n,m[200010],a[200010],c[400010],sum=0,Min=0x7fffffff;
bool vis[400010];
void dfs(int dep,long long mi,int lst){
if(dep==n||mi==Min){
sum+=mi;
sum%=mod;
return;
}
for(int i=lst;i<n*2;i++){
if(!vis[i]){
if(i<n)vis[i]=1,vis[i+n]=1;
else vis[i]=1,vis[i-n]=1;
dfs(dep+1,min(mi,c[i]),i+1);
if(i<n)vis[i]=0,vis[i+n]=0;
else vis[i]=0,vis[i-n]=0;
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>m[i];
for(int i=0;i<n;i++)cin>>a[i],c[i]=a[i]-1;
for(int i=n;i<n*2;i++)c[i]=m[i-n]-a[i-n];
for(int i=0;i<n*2;i++)Min=c[i]<Min?c[i]:Min;
memset(vis,0,sizeof vis);
dfs(0,0x7fffffff,0);
cout<<(sum+1)%mod;
return 0;
}