牛客暑假训练营7-xay loves or

81 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

传送门

题意:

给你两个数x,s,问你有多少个数or上x等于s。

思路:

当x==s时,答案为2的x的二进制位上1的个数次方-1. 否则寻找x的二进制位为1而s的二进制位为1的次数cnt,并判断是否存在x的二进制位为0而s的二进制位为1的情况,若有,则答案为pow(2,cnt)-1,否则为pow(2,cnt)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000];
int res[110];

int main()
{
	ll x,s;
	int cnt = 0;
	cin>>x>>s;
	ll xx=x,ss=s;
	while(x)
	{
		a[++cnt] = x%2;
		x=x>>1;
	}
	int num = 0;
	while(s)
	{
		res[++num] = s%2;
		s=s>>1;
	}
	ll ans = 0;
	ll sum = 0;
	int flag = 0;
	for(int i = 1; i <= cnt; i++)
	{
		if(a[i])
		{
			if(res[i])
			{
				ans++;
			}
			else
			{
				cout<<0<<endl;
				return 0;
			}
		}
		else
		{
			if(res[i])flag = 1;
		}
	}
	for(int i = 1; i <= num; i++)
	if(!a[i] &&res[i])
	{
		flag = 1;
		break;
	}
	ll p = (ll)pow(2,ans);
	if(a[1]&&res[1] && !flag)sum = 1;
	if(xx==ss)cout<<p-1<<endl;
	else
	cout<<p-sum<<endl;
}