8VC Venture Cup 2016 - Final Round (Div. 2 Edition) C. XOR Equation(位运算)(好题*)

题目链接
在这里插入图片描述
题意:两个整数a,b满足a+b=s,a^b=x,求满足条件的a,b的数目
思路:这道题又涨新知识了,有个结论a+b=a^b+(a&b)*2,异或运算其实可以看做没有进位的加法,那么设s-x为d,很显然d从二进制角度来看的话,d如果第i位为1,就代表a+b的第i-1位产生了进位(我这里是从右往左看,最右边为第一位),那么如果d的第i为为0,就代表a和b的第i-1位为不同的,要么0要么1,贡献是2,再根据乘法原理累加答案就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s,x,ans=1;
int main()
{
    scanf("%lld %lld",&s,&x);
    ll d=s-x;
    if(s<x||(d&1)) {
    	printf("0\n");return 0;
	}
	for(int i=1;i<=60;++i)
	{
		if((x>>i-1&1)&&(d>>i&1)==0) ans<<=1;
		if((x>>i-1&1)&&(d>>i&1)) {
			printf("0\n");return 0;
		}
	}
	if(!d) ans-=2;
	printf("%lld\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值