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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		int M = 51;
		long Inf = 1L << 53;
		long[][] WF = new long[M][];
		for(int i=0;i<M;i++){
			WF[i] = new long[M];
			for(int j=0;j<M;j++){
				WF[i][j] = i == j ? 0 : Inf;
			}
		}
		
		for(int i=0;i<M;i++){
			for(int j=1;j<M;j++){
				WF[i][i % j] = Math.Min(WF[i][i % j] , 1L << j);
			}
		}
		
		for(int k=0;k<M;k++){
			for(int i=0;i<M;i++){
				for(int j=0;j<M;j++){
					WF[i][j] = Math.Min(WF[i][j], WF[i][k] + WF[k][j]);
				}
			}
		}
		
		for(int i=0;i<N;i++){
			if(WF[A[i]][B[i]] == Inf){
				Console.WriteLine(-1);
				return;
			}
		}
		
		long[] way = new long[N];
		long tot = 0;
		for(int i=0;i<N;i++){
			way[i] = WF[A[i]][B[i]];
			tot |= way[i];
		}
		
		long ans = 0;
		int[] now = (int[]) A.Clone();
		for(int b=50;b>=0;b--){
			bool chk = false;
			for(int i=0;i<N;i++){
				if(((way[i] >> b) & 1) == 1) chk = true;
			}
			if(!chk) continue;
			ans += 1L << b;
			tot -= 1L << b;
			for(int i=0;i<N;i++){
				if(((way[i] >> b) & 1) == 1){
					way[i] ^= 1L << b;
					now[i] = now[i] % b;
				} else {
					if(WF[now[i] % b][B[i]] <= WF[now[i]][B[i]]){
						now[i] = now[i] % b;
						way[i] = WF[now[i]][B[i]];
					}
				}
			}
		}
		
		Console.WriteLine(ans);
		
	}
	int N;
	int[] A;
	int[] B;
	public Sol(){
		N = ri();
		A = ria();
		B = ria();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}