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>
#include<math.h>

typedef long long int int64;

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))

int cond(int *k,int n,int *a,int *b){
  int t[51];
  int i;
  for(i=0;i<n;i++){
    int aa=a[i];
    int bb=b[i];
    int j;
    for(j=0;j<51;j++) t[j]=0;
    t[aa]=1;
    for(j=50;j>0;j--){
      int kk=k[j];
      if(kk==-1) continue;
      int l;
      for(l=0;l<=aa;l++){
	if(t[l]==1){
	  t[l%kk]=1;
	}
      }
    }
    if(t[bb]==0) return 0;
  }
  return 1;
}

void run(void){
  int n;
  scanf("%d",&n);
  int a[50],b[50];
  int i;
  for(i=0;i<n;i++) scanf("%d",a+i);
  for(i=0;i<n;i++) scanf("%d",b+i);
  int k[51];
  for(i=1;i<=50;i++) k[i]=i;
  k[0]=-1;
  if(!cond(k,n,a,b)){
    printf("-1\n");
    return;
  }
  for(i=50;i>0;i--){
    k[i]=-1;
    if(!cond(k,n,a,b)) k[i]=i;
  }
  int64 cost=0;
  for(i=0;i<=50;i++) cost+=(k[i]>=0?1:0)*(1LL<<i);
  printf("%lld\n",cost);
}

int main(void){
  run();
  return 0;
}