#include<bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn=200010;
const int inf=1000000000000000000;
int n,v,Sum[200010],a[200010],b[200010],c[200010][70],sum[70][200010],vis[70],tot,rt[200010];
void fen(int id,int x){
int tmp=0;
while(x){
tmp++;
if(x%2)
sum[tmp-1][id]=sum[tmp-1][id-1]+1;
x/=2;
}
}
int work(int R){
int l=1,r=R-1,tmp=R,awa=70;
while(l<=r){
int mid=(l+r)/2,flag=0;
for(int i=0;i<=63;i++){
if(vis[i])
continue;
if(sum[i][R]-sum[i][mid]!=(R-mid+1))
flag++,awa=i;
}
if(flag<=1){
r=mid-1;
tmp=min(tmp,mid);
}
else
l=mid+1;
}
if(awa==70)
return tmp;
vis[awa]=1;
return tmp;
}
struct node{
int son[2],v;
}t[Maxn*36];
void modify(int nw,int lst,int x){
for(int i=63;i>=0;i--){
t[nw].v=t[lst].v+1;
if((x&(1ll<<i))==0){
if(!t[nw].son[0])
t[nw].son[0]=++tot;
t[nw].son[1]=t[lst].son[1];
nw=t[nw].son[0];
lst=t[lst].son[0];
}
else{
if(!t[nw].son[1])
t[nw].son[1]=++tot;
t[nw].son[0]=t[lst].son[0];
nw=t[nw].son[1];
lst=t[lst].son[1];
}
}
t[nw].v=t[lst].v+1;
}
int work1(int r,int l,int x){
int ans=0,flag=1,qwq=1;
for(int i=63;i>=0;i--){
int tmp=(x&(1ll<<i));
if(qwq&&tmp==0)
continue;
if(tmp)
qwq=0,tmp=1;
if(flag==0){
if(t[t[r].son[0]].v-t[t[l].son[0]].v>0)
r=t[r].son[0],l=t[l].son[0];
else
ans+=(1ll<<i),r=t[r].son[0],l=t[l].son[0];
}
else{
if(tmp==0){
if(t[t[r].son[0]].v-t[t[l].son[0]].v>0)
r=t[r].son[0],l=t[l].son[0];
else
ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1],flag=0;
}
else{
ans+=(1ll<<i);
if(t[t[r].son[1]].v-t[t[l].son[1]].v<=0)
return -inf;
r=t[r].son[1],l=t[l].son[1];
}
}
}
return ans;
}
int work2(int r,int l,int x){
int ans=0,flag=1,qwq=1;
for(int i=63;i>=0;i--){
int tmp=(x&(1ll<<i));
if(qwq&&tmp==0)
continue;
if(tmp)
tmp=1,qwq=0;
if(flag==0){
if(t[t[r].son[1]].v-t[t[l].son[1]].v>0)
ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1];
else
r=t[r].son[0],l=t[l].son[0];
}
else{
if(tmp==1){
if(t[t[r].son[1]].v-t[t[l].son[1]].v>0)
ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1];
else
r=t[r].son[0],l=t[l].son[0],flag=0;
}
else{
if(t[t[r].son[0]].v-t[t[l].son[0]].v<=0)
return -inf;
r=t[r].son[0],l=t[l].son[0];
}
}
}
return ans;
}
int Find(int r,int l,int x){
return min(abs(work1(r,l,x)-v),abs(work2(r,l,x)-v));
}
signed main(){
cin>>n>>v;
int ans=v;
for(int i=1;i<=n;i++){
cin>>a[i];
fen(i,a[i]);
}
for(int i=1;i<=n;i++)
cin>>b[i],Sum[i]^=b[i];
ans=min(ans,abs(v-a[1]*b[1]));
rt[1]=++tot;
modify(rt[1],rt[0],Sum[1]);
for(int i=2;i<=n;i++){
int r=i,tmp=a[i];
memset(vis,0,sizeof vis);
rt[i]=++tot;
modify(rt[i],rt[i-1],Sum[i]);
while(r){
tmp&=a[r];
int l=work(r);
if(tmp==0)
break;
int p=(v/tmp)^Sum[i];
l--;
if(l==0)
ans=min(ans,min(abs(v-p),Find(rt[i],rt[0],p)));
else
ans=min(ans,Find(rt[i],rt[l-1],p));
r=l;
}
ans=min(ans,abs(v-a[i]*b[i]));
}
cout<<ans;
return 0;
}
