OR
链接: link.
题目:
题解:
当
z
=
x
+
y
z=x+y
z=x+y时,有
z
=
x
∣
y
+
x
z=x|y+x
z=x∣y+x&
y
y
y
所以
a
a
a&
b
b
b=
c
−
b
c-b
c−b,将
c
−
b
c-b
c−b的值赋值给
c
c
c(c后续无用可替代)
当
c
−
b
<
0
c-b<0
c−b<0时,意味着
c
=
0
c=0
c=0&&
b
=
1
b=1
b=1,不合理
当
!
x
x
!xx
!xx&&
y
y
yy
yy时,意味着
x
x
=
0
xx=0
xx=0&&
y
y
=
1
yy=1
yy=1,不合理
当
!
x
x
!xx
!xx&&
!
y
y
!yy
!yy&&
x
x
x,意味着
x
x
=
0
xx=0
xx=0&&
y
y
=
0
yy=0
yy=0,但
x
=
1
x=1
x=1,不合理
当
x
x
xx
xx&&
y
y
yy
yy&&
!
x
!x
!x,意味着
x
x
=
1
xx=1
xx=1&&
y
y
=
1
yy=1
yy=1,但
x
=
0
x=0
x=0,不合理
当
r
e
1
re1
re1和
r
e
2
re2
re2均返回1时,说明此时两种都可以,结果乘以2;均返回0,说明不可能成立;返回一个1,则此处一种情况。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[100010],c[100010];
bool re(int k,int x,int n)
{
for(int i=1;i<n;i++)
{
int xx=(b[i]>>k)&1;
int yy=(c[i]>>k)&1;
if(xx&&!yy)x^=1;
if(!xx&&yy)return 0;
if(!xx&&!yy&&x)return 0;
if(xx&&yy&&!x)return 0;
}
return 1;
}
signed main()
{
int n,flag=0;
cin>>n;
for(int i=1;i<n;i++)cin>>b[i];
for(int i=1;i<n;i++)
{
cin>>c[i];
c[i]=c[i]-b[i];
if(c[i]<0)flag=1;
}
if(flag==1)cout<<"0"<<endl;
else
{
int ans=1;
int re1,re2;
for(int i=0;i<32;i++)
{
re1=re(i,0,n);
re2=re(i,1,n);
if(re1&&re2)ans*=2;
if(!re1&&!re2)
{
ans=0;
break;
}
}
cout<<ans<<endl;
}
}