这个题很好啊。。。(算是我很久没活跃思维的复健题了,,,,,)
首先很显然
当 u == v 直接输出 1 u
当 u> v 直接输出-1
u ==v == 0时候,直接输出0
u与v奇偶性不同,直接输出-1
这里要联系后面操作
你容易想起来 :
X
x
o
r
X
=
0
X xor X = 0
XxorX=0
对吧。。。。
然后只要这么来就好了
U
x
o
r
X
x
o
r
X
=
u
U xor X xor X = u
UxorXxorX=u
此时有
X
=
(
v
−
u
)
/
2
X = (v - u)/2
X=(v−u)/2
所以此时当u,v奇偶性不同就是无解了好好想一下为什么。。(二进制这里可以自由变换。。。)
但注意到 有长度为2的情况。。。
想一下怎么样能有长度为2的情况
注意原来的式子是
U
x
o
r
X
x
o
r
X
=
U
U xor X xor X = U
UxorXxorX=U
此时x可以跟u合并,或者x可以跟x合并
当x与x合并,发现怎么来都是0
于是考虑U和x合并。。。
U
x
o
r
X
x
o
r
X
=
U
U xor X xor X = U
UxorXxorX=U
U
+
X
+
X
=
V
U + X + X = V
U+X+X=V
然后根据一个性质
就是当u和x二进制位没有相同的时候,异或相当于加法。。。
也就是说
当u和x二进制位没有相同的时候
U
x
o
r
X
x
o
r
X
=
(
U
+
X
)
x
o
r
X
=
U
U xor X xor X =(U + X) xor X = U
UxorXxorX=(U+X)xorX=U
那么此时,就可以缩减为长度2了。。。。。
我好菜啊。。。
我原来还想着。贪心。。。我看一眼C,做不得,单走一个D,,,,还wa6次。。。。
#include<bits/stdc++.h>
using namespace std;
unsigned long long u,v;
int main(){
cin>>v>>u;
if(v == 0 && u == 0){
cout<<0<<endl;
exit(0);
}
if(v == u){
cout<<1<<endl;
cout<<v<<endl;
exit(0);
}
if(v > u || (u%2) != (v%2)){
cout<<-1<<endl;
exit(0);
}
unsigned long long x = (u - v)/2;
if((x ^ v) == x + v){
cout<<2<<endl;
cout<<x + v<<" "<<x<<endl;
exit(0);
}
cout<<3<<endl;
cout<<v<<" "<<x<<" "<<x<<endl;
exit(0);
}