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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=10000020;
const int INF=0x3f3f3f3f;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("C.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
int dp[52][52];
bool check(int x,int y,int z){ //x->y without z 
	if (x==y)
		return 1;
	for(int i=1;i<z;i++)
		if (dp[x%i][y]!=INF)
			return 1;
	return 0;
}
int a[52],b[52];
int main(){
	init();
	for(int i=0;i<=50;i++){
		memset(dp[i],0x3f,sizeof(dp[i]));
		dp[i][i]=0;
		for(int j=1;j<=i;j++)
			for(int k=0;k<=50;k++)
				dp[i][k]=min(dp[i][k],max(dp[i%j][k],j));
		// for(int j=0;j<=i;j++)
			// printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
	}
	int n=readint();
	for(int i=1;i<=n;i++)
		a[i]=readint();
	for(int i=1;i<=n;i++){
		b[i]=readint();
		if (dp[a[i]][b[i]]==INF)
			return puts("-1"),0;
	}
	ll ans=0;
	for(int i=50;i;i--){
		bool flag=false;
		// for(int j=1;j<=n;j++)
			// printf("%d\n",a[j]);
		for(int j=1;j<=n;j++)
			if (!check(a[j],b[j],i)){
				flag=true;
				break;
			}
		if (flag){
			ans+=1LL<<i;
			// printf("i=%d\n",i);
			for(int j=1;j<=n;j++)
				if (dp[a[j]%i][b[j]]<=dp[a[j]][b[j]]){
					// printf("do %d %d\n",a[j],i);
					a[j]%=i;
				}
		}
	}
	printf("%lld",ans);
}