题目描述
xay loves or. He gives you x and s, you need to calculate how many positive integer y satisfy x or y = s .
输入描述
The first line contains two positive integers x and s .
It’s guaranteed that 1 ≤ x , s < 2 ^ 31 .
输出描述
Print the number of y satisfy x or y = s .
输入样例
2 5
输出样例
0
题目大意:给定 x 和 s,求有多少个正整数 y 满足 x or y = s;
快乐签到题,唯一的坑点是 y 是正整数,因此只需要在 x = s 时将 y 的数量 -1 即可。
其中, x 和 s 每一位的出现共有四种情况:
① x = 1,s = 0,此时 y 无解,直接输出 0 即可;
② x = 1,s = 1,此时 y 可为 0 或 1 ,即 y * = 2;
③ x = 0,s = 0,此时 y 只能为 0;
④ x = 0,s = 1,此时 y 只能为 1;
因此本题仅需特判 x 和 s 对应的每一位是否满足条件 ① ② 中的一组并进行处理即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ax[40],as[40];
ll lb(ll a){
return a&(-a);
}
int main(){
ll x,s,b,c,y=1,cnt;
cin>>x>>s;
ll xx=x,ss=s;
while(x){
b=lb(x);
x-=b;
cnt=0;
while(b){
b/=2;
cnt++;
}
ax[cnt]=1;
}
while(s){
c=lb(s);
s-=c;
cnt=0;
while(c){
c/=2;
cnt++;
}
as[cnt]=1;
}
for(int i=32;i>=1;i--){
if(ax[i]==1&&as[i]==0){
cout<<'0'<<endl;
return 0;
}
if(ax[i]==1&&as[i]==1)
y=y*2;
}
if(xx==ss)
y--;
cout<<y<<endl;
return 0;
}