😀 算法标签:二进制 |
求出对于给到的xxx和sss,存在多少个yyy满足x or y=sx\ or \ y = sx or y=s。
首先考虑yyy恒为000的情况:xxx的某一位为111,sss的对应位为000。
再考虑yyy的情况种数:统计xxx和sss同一位都为111的位数,同时为111,那么对于该位yyy就有两种选择:然后2n2^n2n输出即可。
喜提WA…再读题,正整数。。。
考虑什么时候会出现000这种及其特殊的数字:xxx的某一位为000,sss的对应位为111,此时一定会出现yyy取0的情况。单独挑出来−1-1−1即可。
#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
ll binpow(ll a, ll b) {
ll res = 1;
while (b > 0) {
if (b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
signed main(){
int x, s; cin >> x >> s;
int cnteq = 0, cntneq = 0;
bool flag = 1;
while(x || s){
int xbit = x & 1, sbit = s & 1;
if(xbit == 1 && sbit == 0) return cout << 0 << endl, 0;
if(xbit == 1 && sbit == 1) cnteq++;
if(xbit == 0 && sbit == 1) flag = false;
x >>= 1, s >>= 1;
}
if(flag) cout << binpow(2, cnteq) - 1 << endl;
else cout << binpow(2, cnteq) << endl;
return 0;
}