Bitwise Equations
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 645 Accepted Submission(s): 343
Problem Description
You are given two positive integers X and K. Return the K-th smallest positive integer Y, for which the following equation holds: X + Y =X | Y
Where '|' denotes the bitwise OR operator.
Where '|' denotes the bitwise OR operator.
Input
The first line of the input contains an integer T (T <= 100) which means the number of test cases.
For each case, there are two integers X and K (1 <= X, K <= 2000000000) in one line.
For each case, there are two integers X and K (1 <= X, K <= 2000000000) in one line.
Output
For each case, output one line containing the number Y.
Sample Input
3 5 1 5 5 2000000000 2000000000
Sample Output
2 18 16383165351936解体思路:这道题目可以这样想,就是求出x的二进制,k的二进制,x的二进制序列中只有等于零处可以填充k的二进制数,要将k的二进制数填完。填好后,再转换成十进制后就是答案。代码如下:#include<stdio.h> #include<cmath> int a[40]; int b[40]; int main(){ int t; int x,k,num,d,l; long long m; scanf("%d",&t); while(t--){ d=0;l=0;num=0;m=0; scanf("%d%d",&x,&k); while(x){ if(x%2==0){ a[++d]=l;//d表示一共有多少的零 } x=x/2; l++;//从0位开始计算 } while(k){ b[++num]=k%2; k=k/2; } for(int i=1;i<=d&&i<=num;i++) m+=b[i]*pow(2,a[i]); if(num>d){ for(int i=d+1;i<=num;i++){ m+=b[i]*pow(2,l); l++; } } printf("%lld\n",m); } return 0; }