CF1325D. Ehab the Xorcist

求一个长度最短的数组,异或$=u$,其和$=v$

因为和会进位所以$v>u$,
考虑进位产生的$v-u$,一定由原本数组里面二进制$1,1产生$进位不可能是奇数。设$p=(v-u)/2$

  • 如果$p\&u =0$表示进位的数与$u$二进制无关,那么只需要$p,p|u$。进位的就可以加上了。

  • 如果$p\&u !=0$表示进位的数与$u$二进制有关,重复到的二进制就需要有个新的$1$平衡。那么只需要$p,p|u,u\&p$。

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;

ll u, v;
int main()
{
cin >> u >> v;
if (v == 0 && u == 0)
{

cout << 0 << endl;
return 0;
}
if (v == 0)
{
cout << -1 << endl;
return 0;
}
if (u == 0)
{
if (v & 1)
cout << -1 << endl;
else
{
cout << 2 << endl;
cout << v / 2 << " " << v / 2 << endl;
}
return 0;
}
if (u == v)
{

cout << 1 << endl;
cout << u << endl;
return 0;
}
if (u > v)
{
cout << -1 << endl;
return 0;
}

else
{
if ((v - u) % 2)
cout << -1 << endl;
else
{

ll p = (v - u) / 2;

if ((u & p) == 0)
{
cout << 2 << endl;
cout << (u | p) << " " << p << endl;
}
else
{
cout << 3 << endl;
cout << (u | p) << " " << p << " " << (u & p) << endl;
}
}
}
}