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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
#define int long long
#define inf (int)(1e18)

int min(int a, int b){
	return a <= b ? a : b;
}

signed main(){
	int N, s, t, i, j, k, ans = 0;
	scanf("%lld", &N);
	int *a = (int *)malloc(sizeof(int) * N);
	int *b = (int *)malloc(sizeof(int) * N);
	for(i = 0; i < N; i++){
		scanf("%lld", &a[i]);
	}
	for(i = 0; i < N; i++){
		scanf("%lld", &b[i]);
	}
	int **dis = (int **)malloc(sizeof(int *) * 51);
	for(i = 0; i <= 50; i++){
		dis[i] = (int *)malloc(sizeof(int) * 51);
	}

	for(i = 0; i <= 50; i++){
		dis[i] = (int *)malloc(sizeof(int) * 51);
		for(j = 0; j <= 50; j++){
			dis[i][j] = i == j ? 0 : inf;
		}
	}
	for(i = 0; i <= 50; i++){
		for(j = 1; j <= 50; j++){
			dis[i][i % j] = min(dis[i][i % j], (int)1 << j);
		}
	}
	for(k = 0; k <= 50; k++){
		for(i = 0; i <= 50; i++){
			for(j = 0; j <= 50; j++){
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}
	for(i = 0; i < N; i++){
		if(dis[a[i]][b[i]] == inf){
			printf("-1\n");
			return 0;
		}
	}

	for(s = 50; s >= 0; s--){
		for(t = 0; t <= s; t++){

			for(i = 0; i <= 50; i++){
				for(j = 0; j <= 50; j++){
					dis[i][j] = i == j ? 1 : 0;
				}
			}
			for(i = 0; i <= 50; i++){
				for(j = 1; j <= 50; j++){
					if((ans & ((int)1 << j)) != 0 || j <= t){
						dis[i][i % j] = 1;
					}
				}
			}
			for(k = 0; k <= 50; k++){
				for(i = 0; i <= 50; i++){
					for(j = 0; j <= 50; j++){
						dis[i][j] = dis[i][j] | (dis[i][k] & dis[k][j]);
					}
				}
			}
			int f = 1;
			for(i = 0; i < N; i++){
				if(dis[a[i]][b[i]] == 0){
					f = 0;
					break;
				}
			}
			if(f == 1){
				ans |= (int)1 << t;
				break;
			}

		}
	}

	printf("%lld\n", ans - 1);
	return 0;
}