OR(牛客暑假第八场)

OR
链接: link.
题目:
在这里插入图片描述
在这里插入图片描述
题解:
z = x + y z=x+y z=x+y时,有 z = x ∣ y + x z=x|y+x z=xy+x& y y y
所以 a a a& b b b= c − b c-b cb,将 c − b c-b cb的值赋值给 c c c(c后续无用可替代)
c − b < 0 c-b<0 cb<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;
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值