#include using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vl; int n; unordered_map compress; int nums = 0; vi A,B; const int MAXN = 1000001; const int mod = 1000000007; int TWO[MAXN] = {0}; int F[MAXN] = {0}; int CC[MAXN] = {0}; bool seen[MAXN] = {0}; int cc = 0; vi ind; int main() { cin >> n; int t = 1; rep(c1,0,n){ int a; cin >> a; if(compress.find(a) == compress.end()){ compress[a] = nums; A.push_back(nums); nums++; } else{ A.push_back(compress[a]); } t *= 2; t %= mod; TWO[c1+1] = t; } rep(c1,0,n){ int a; cin >> a; B.push_back(compress[a]); ind.push_back(c1); } random_shuffle(all(ind)); int ans = 0; int iterations = 0; int LIM = 40; rep(c1,0,n){ int i = ind[c1]; if(!seen[i]){ iterations++; cc++; int non_zeros = 0; int tmp = 1; seen[i] = 1; rep(c2,1,n){ int j = (i+c2-1)%n; int a = A[j]; int b = B[j]; if(CC[a] != cc){ CC[a] = cc; F[a] = 0; } if(CC[b] != cc){ CC[b] = cc; F[b] = 0; } if(F[a] == 0)non_zeros++; if(F[b] == 0)non_zeros++; F[a]++; F[b]--; if(F[a] == 0)non_zeros--; if(F[b] == 0)non_zeros--; if(non_zeros == 0){ seen[(j+1)%n] = 1; tmp++; } } ans += TWO[tmp] - tmp - 1; if(ans >= mod)ans -= mod; if(ans < 0)ans += mod; } if(iterations >= LIM)break; } cout << ans << "\n"; return 0; }