Bitwise Equations
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 633 Accepted Submission(s): 335
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
![快哭了](http://static.blog.csdn.net/xheditor/xheditor_emot/default/fastcry.gif)
#include <string.h> #include <iostream> using namespace std; long long rets=0; class jisuan { public: long long kthPlusOrSolution(int, int); string getBin(int); }; string jisuan::getBin(int x) { string ret=""; if(x==0) { ret="0"; return ret; } while(x>0) { ret=char(x%2+'0')+ret; x/=2; } return ret; } long long jisuan::kthPlusOrSolution(int x, int k) { string strx, strk; strx=getBin(x); strk=getBin(k); int lx=strx.length()-1; int lk=strk.length()-1; string ret=""; while(lx>=0 && lk>=0) { if(strx[lx]=='1') { ret="0"+ret; --lx; } else { ret=strk[lk]+ret; --lx; --lk; } } while(lk>=0) ret=strk[lk--]+ret; for(int i=0;i<(int)ret.length();i++) rets=(rets<<1)+ret[i]-'0'; return rets; } int main() { int n,x,k; jisuan bit; cin>>n; while(n--) { rets=0; cin>>x>>k; bit.kthPlusOrSolution(x,k); cout<<rets<<endl; } }
![吐舌头](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
![哭](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif)