C. XOR Equation

来源:互联网 发布:我的淘宝等级怎么看 编辑:程序博客网 时间:2024/04/29 21:18

题意:s是a,b之和,x是a,b异或的值。求有多少个a,b对。(a,b为有序队列)

题解:a+b可分解为a^b[个位相加]和(a&b)*2[进位],即a+b=a^b+(a&b)*2.

然后进行2进制枚举。设s=(s-x)/2(即s=a&b).当x(即为a^b)=1时,s必为0,此时a,b有两种取值情况;当x=0时,s的取值决定了最终的a,b取值.具体看代码。

#include <set>#include <map>#include <stack>#include <queue>#include <deque>#include <cmath>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF  0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-9#define maxn 1000100#define MOD 1000000007long long s,x;int main(){    int t;    while(scanf("%lld%lld",&s,&x) != EOF)    {        long long ans = 0;        s -= x;        if(s % 2 == 1)        {            printf("0\n");            continue;        }        s /= 2;        int flag = 0,cnt = 0;        if(!s)            cnt = 2;        for(int i = 0; i < 64; i++)        {            int a1 = s & 1;            int a2 = x & 1;            if(a1 == 1 && a2 == 1)            {                flag = 1;                break;            }            s >>= 1;            x >>= 1;            if(a2 == 0)                continue;            ans++;        }        if(flag)            printf("0\n");        else            printf("%lld\n",(1ll<<ans)-cnt);    }    return 0;}


0 0
原创粉丝点击