传送门
首先我们先来谈谈一会异或
x
o
r
xor
xor
今天又学习到了一个新的知识
a
⨁
b
=
a
+
b
−
2
(
a
&
b
)
a \bigoplus b=a+b-2(a\&b)
a⨁b=a+b−2(a&b) 以及异或和 <= 总和
下面来说说题意:
给定两个数字
u
u
u,
v
v
v.构造几个数,使他们的异或和为u,和为v
- 如果只有一个构造的序列只有一个数字,那么自然满足,这个时候 u = = v u==v u==v
- 由于异或性质,只有奇数个奇数在异或时和奇数,所以我们推出u和v%2同余
- 因为异或和 <= 总和 所以 u > v u > v u>v不成立
- 朴素情况下令
x
=
(
v
−
u
)
/
2
x=(v-u)/2
x=(v−u)/2,此时构造出
(
u
,
x
,
x
)
(u,x,x)
(u,x,x)答案一定满足
但是我们发现仍然有机会优化:由上面的公式可以知道 u ⨁ v = u + x − 2 ( u & x ) u \bigoplus v = u + x -2(u\&x) u⨁v=u+x−2(u&x)推导得出:
( u + x + x ) = ( u ⨁ x ) + x (u+x+x) = (u \bigoplus x)+x (u+x+x)=(u⨁x)+x
u ⨁ x ⨁ x = u ⨁ x ⨁ x u\bigoplus x\bigoplus x = u \bigoplus x\bigoplus x u⨁x⨁x=u⨁x⨁x
所以 ( u & x ) = 0 (u\&x) = 0 (u&x)=0当时,可以把答案化简为 ( u ⨁ x ) (u\bigoplus x) (u⨁x)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll u,v;
cin >> u >> v;
if(u > v || u % 2 != v % 2)
{
return printf("-1\n"),0;
}
if(u == v && u == 0)
{
cout <<"0";
}
else if(u == v)
{
cout << "1\n" << v <<"\n";
}
else
{
ll x = (v - u) / 2;
if(x & u)
{
cout << "3\n" << x << " "<< x << " "<< u;
}
else cout <<"2\n" << (x^u) << " " << x;
puts("");
}
return 0;
}