Problem:
Score : 700 points

Problem Statement

Aoki is playing with a sequence of numbers a_{1}, a_{2}, ..., a_{N}. Every second, he performs the following operation :

Choose a positive integer k. For each element of the sequence v, Aoki may choose to replace v with its remainder when divided by k, or do nothing with v. The cost of this operation is 2^{k} (regardless of how many elements he changes).

Aoki wants to turn the sequence into b_{1}, b_{2}, ..., b_{N} (the order of the elements is important). Determine if it is possible for Aoki to perform this task and if yes, find the minimum cost required.

Constraints

1 \leq N \leq 50

0 \leq a_{i}, b_{i} \leq 50

All values in the input are integers.

Input

Input is given from Standard Input in the following format:

N
a_{1} a_{2} ... a_{N}
b_{1} b_{2} ... b_{N}

Output

Print the minimum cost required to turn the original sequence into b_{1}, b_{2}, ..., b_{N}. If the task is impossible, output -1 instead.

Sample Input 1

3
19 10 14
0 3 4

Sample Output 1

160

Here's a possible sequence of operations :

Choose k = 7. Replace 19 with 5, 10 with 3 and do nothing to 14. The sequence is now 5, 3, 14.

Choose k = 5. Replace 5 with 0, do nothing to 3 and replace 14 with 4. The sequence is now 0, 3, 4.

The total cost is 2^{7} + 2^{5} = 160.

Sample Input 2

3
19 15 14
0 0 0

Sample Output 2

2

Aoki can just choose k = 1 and turn everything into 0. The cost is 2^{1} = 2.

Sample Input 3

2
8 13
5 13

Sample Output 3

-1

The task is impossible because we can never turn 8 into 5 using the given operation.

Sample Input 4

4
2 0 1 8
2 0 1 8

Sample Output 4

0

Aoki doesn't need to do anything here. The cost is 0.

Sample Input 5

1
50
13

Sample Output 5

137438953472

Beware of overflow issues.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int N = 55;
bool can[N];
vector<pii> T[N];

vector<int> a,b;

bool vis[N];
int n;

void dfs(int u){
  vis[u]=true;
  for(auto x : T[u]){
    if(can[x.se]){
      if(!vis[x.fi])dfs(x.fi);
    }
  }
}


bool check(){
  for(int i = 0; i < n; i ++ ){
    for(int j = 0 ; j < N ; j ++ ) vis[j]=false;
    dfs(a[i]);
    if(!vis[b[i]])return false;
  }
  return true;
}

int main(){
  fastIO;
  for(int i = 0 ; i < N ; i ++ ){
    for(int j = 1 ; j < N ; j ++ ){
      if(i % j < i){
        T[i].push_back(mp(i % j, j));
      }
    }
  }
  cin >> n;
  a.resize(n);
  b.resize(n);
  for(int i = 0 ; i < n; i ++ ) cin >> a[i];
  for(int i = 0 ; i < n; i ++ ) cin >> b[i];
  ll ans = 0;
  for(int bit = N - 1; bit >= 1; bit -- ){
    can[bit]=false;
    for(int j = bit-1; j >= 0 ; j -- ) can[j]=true;
    if(!check()){
      if(bit == N - 1){
        cout << "-1\n";
        return 0;
      }
      ans |= (1ll << bit);
      can[bit]=true;
    }
    else{
      for(int j = bit; j >= 0 ; j -- ) can[j]=false;
    }
  }
  cout << ans << "\n";
  return 0;
}