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 <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const double eps=1e-10;
const double pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

int n;
int a[58],b[58];
bool dp[58][58][58];int DP[58][58];
bool Dp[58][58];
int valid[58],vtot;
int anslist[58],tot;

inline void init_dp()
{
	memset(dp,false,sizeof(dp));
	int i,j,k;
	for (i=0;i<=50;i++) dp[i][i][0]=dp[i][i][1]=true;
	for (i=0;i<=50;i++) dp[i][0][1]=true;
	for (k=2;k<=50;k++)
		for (i=0;i<=50;i++)
			for (j=0;j<=50;j++)
			{
				if (dp[i][j][k-1]) {dp[i][j][k]=true;continue;}
				if (dp[i%k][j][k-1]) {dp[i][j][k]=true;continue;}
				dp[i][j][k]=false;
			}
	for (i=0;i<=50;i++)
		for (j=0;j<=50;j++)
		{
			for (k=0;!dp[i][j][k] && k<=50;k++) {}
			DP[i][j]=k;
		}
}

inline bool judge()
{
	int res=-1;
	int i,j,k,cc;
	for (i=1;i<=n;i++)
	{
		memset(Dp,false,sizeof(Dp));
		Dp[0][a[i]]=true;
		for (j=0;j<=vtot-1;j++)
			for (k=0;k<=50;k++)
				if (Dp[j][k])
				{
					Dp[j+1][k]=true;
					Dp[j+1][k%valid[j+1]]=true;
				}
		if (!Dp[vtot][b[i]]) return false;
	}
	return true;
}

int main ()
{
	n=getint();int i,calc;
	for (i=1;i<=n;i++) a[i]=getint();
	for (i=1;i<=n;i++) b[i]=getint();
	tot=0;
	for (calc=50;calc>0;calc--)
	{
		vtot=0;for (i=1;i<=tot;i++) valid[++vtot]=anslist[i];
		for (i=calc-1;i;i--) valid[++vtot]=i;
		if (judge()) continue;
		anslist[++tot]=calc;
	}
	LL ans=0;for (i=1;i<=tot;i++) ans+=(1ll<<anslist[i]);
	printf("%lld\n",ans);
	return 0;
}