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: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define R cin>>
#define Z class
#define ll long long
#define ln cout<<'\n'
#define in(a) insert(a)
#define pb(a) push_back(a)
#define pd(a) printf("%.10f\n",a)
#define mem(a) memset(a,0,sizeof(a))
#define all(c) (c).begin(),(c).end()
#define iter(c) __typeof((c).begin())
#define rrep(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define REP(i,m,n) for(ll i=(ll)(m);i<(ll)(n);i++)
#define rep(i,n) REP(i,0,n)
#define tr(it,c) for(iter(c) it=(c).begin();it!=(c).end();it++)
template<Z A>void pr(A a){cout<<a;ln;}
template<Z A,Z B>void pr(A a,B b){cout<<a<<' ';pr(b);}
template<Z A,Z B,Z C>void pr(A a,B b,C c){cout<<a<<' ';pr(b,c);}
template<Z A,Z B,Z C,Z D>void pr(A a,B b,C c,D d){cout<<a<<' ';pr(b,c,d);}
template<Z A>void PR(A a,ll n){rep(i,n){if(i)cout<<' ';cout<<a[i];}ln;}
ll check(ll n,ll m,ll x,ll y){return x>=0&&x<n&&y>=0&&y<m;}
const ll MAX=1e9+7,MAXL=1LL<<61,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef pair<ll,ll> P;

ll d[55][55];

void Main() {
  rep(i,55) {
    rep(j,55) d[i][j]=MAXL;
    d[i][i]=0;
  }
  rep(i,55)REP(k,1,55) d[i][i%k]=min(d[i][i%k],1LL<<k);
  rep(k,55)rep(i,55)rep(j,55) {
    if(d[i][k]!=MAXL&&d[k][j]!=MAXL) d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  }
  ll n;
  R n;
  vector<ll> a(n),b(n);
  ll ans=MAXL,cost=0;
  rep(i,n) R a[i];
  rep(i,n) R b[i];
  while(1) {
    vector<ll> v[n],g[n];
    rep(k,n) {
      ll c[55],q[55],r[55];
      memset(q,-1,sizeof(q));
      fill(c,c+55,MAXL);
      c[a[k]]=0;
      priority_queue<P,vector<P>,greater<P> > que;
      que.push(P(0,a[k]));
      while(!que.empty()) {
        P p=que.top();que.pop();
        ll x=p.S,cc=p.F;
        if(cc>c[x]) continue;
        REP(i,1,55) {
          ll y=x%i;
          if(c[y]>cc+(1LL<<i)) {
            c[y]=cc+(1LL<<i);
            q[y]=x;
            r[y]=i;
          }
        }
      }
      ll x=b[k];
      if(c[x]==MAXL) {
        pr(-1);
        return;
      }
      while(x!=a[k]) {
        v[k].pb(q[x]);
        g[k].pb(r[x]);
        x=q[x];
      }
      reverse(all(v[k]));
      reverse(all(g[k]));
    }
    set<ll> s;
    rep(i,n) {
      rep(j,g[i].size()) s.in(g[i][j]);
    }
    ll sum=cost;
    tr(it,s) sum+=1LL<<*it;
    ans=min(ans,sum);
    ll M=0;
    rep(i,n) if(g[i].size()) M=max(M,g[i][0]);
    if(a==b) {
      pr(ans);
      return;
    }
    ll dd[55][55];
    rep(i,55)rep(j,55) dd[i][j]=d[i][j];
    rep(i,55) dd[i][i%M]=0;
    rep(k,55)rep(i,55)rep(j,55) {
      if(dd[i][k]!=MAXL&&dd[k][j]!=MAXL) dd[i][j]=min(dd[i][j],dd[i][k]+dd[k][j]);
    }
    rep(k,n) {
      if(dd[a[k]][b[k]]>=dd[a[k]%M][b[k]]) a[k]%=M;
    }
    cost+=1LL<<M;
  }
}

int main(){ios::sync_with_stdio(0);cin.tie(0);Main();return 0;}