二进制 + 比大小
在 异或数B 的二进制下,陪凑 X 和 Y,大小分一下;同时记录下 Sum,和 加和A 比大小,判断这位是 0 or 1,但是第11个点炸了
#include<iostream>
#include<cstdio>
using namespace std;
typedef unsigned long long ull;
ull a, b; // a+b and a^b
ull x[70], y[70];
ull m[70];
inline ull sol(ull s[]) {
ull tt = 0;
for(int i=64;i>=1;--i) {
if(s[i]) tt += m[i];
}
return tt;
}
int main() {
scanf("%llu%llu", &a, &b);
if(a < b) {
puts("-1");
return 0;
}
m[1] = 1;
for(int i=2;i<=64;++i) m[i] = m[i-1] << 1;
// cout<<m[8]<<endl;
int tag = 64;
while(m[tag] > a) -- tag;
ull sum = 0;
for(int i=tag;i>=1;--i) {
if((b >> (i-1)) & 1) {
if(sum + m[i] <= a) {
x[i] = 1;
y[i] = 0;
sum += m[i];
}
} else {
if(sum + 2*m[i] <= a) {
x[i] = 1;
y[i] = 1;
sum += 2*m[i];
} else {
x[i] = 0;
y[i] = 0;
}
}
}
// for(int i=tag+1;i>=1;--i) printf("%5d ", m[i]);
// putchar('\n');
// for(int i=tag+1;i>=1;--i) printf("%5d ", x[i]);
// putchar('\n');
// for(int i=tag+1;i>=1;--i) printf("%5d ", y[i]);
// putchar('\n');
ull ans1 = 0, ans2 = 0;
ans1 = sol(x);
ans2 = sol(y);
// printf("%llu %llu\n", ans1, ans2);
if(ans1 + ans2 != a) puts("-1");
else printf("%llu %llu\n", ans2, ans1);
return 0;
}
/*
142 76
: 33 109
*/