 /**//*
给出A,B ,求X,Y,使得 A = X + Y, B = X xor Y。要使得X最小,若不存在输出-1
0<=A,B<2^64

看了解题报告的,挺巧的,切入点是:“使得X最小” -----------------OMG
若(X,Y)是满足条件的一对数,则检查每一位
若Xi = 1, Yi = 0 则可交换这两位,上面的等式还是成立,但是X减小了,Y增大了
完成上面的操作后,(X,Y)的情况只能是(0,1),(0,0),(1,1)
则有 Y - X = X xor Y = B -------------------OMG
所以 X = (A-B)/2 , Y = (A+B)/2

巧丫 ..
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<ctime>
#include<bitset>

using namespace std;


int main()
  {
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif

 for (unsigned long long A, B; cin>>A>>B; ) {
//A = X + Y, B = X ^ Y . X is minimal
//swap(xi,yi) if xi = 1 and yi = 0, the equalities above mantian.
//after all the swaping, we can find that
//(xi,yi) can only be (0,1) , (0,0), (1,1)
//so X ^ Y = Y - X = B
 if (((A&1) ^ (B&1)) || A < B) {
cout << -1 << endl;
 } else {
cout << (A-B)/2 <<" "<< (A+B)/2<<endl;
}
}
return 0;
}
|