Ehab the Xorcist

 Problem - 1325D - Codeforces

题意

给定整数 u 和 v(0≤u,v≤10e18),试构造长度最短的数组,使得数组内所有元素的异或和为 u,加和为 v。

如果有解,输出两行,第一行输出一个整数 n,第二行输出 n 个非负整数,表示数组里的元素。多解输出任意一组即可。如果无解,输出一行一个整数 −1。

输入输出样例

输入 #1复制

2 4

输出 #1复制

2
3 1

输入 #2复制

1 3

输出 #2复制

3
1 1 1

输入 #3复制

8 5

输出 #3复制

-1

输入 #4复制

0 0

输出 #4复制

0
// Problem: D - Ehab the Xorcist
// Contest: Virtual Judge - 贪心
// URL: https://vjudge.net/contest/571982#problem/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include//切割strtream头文件
#include//INT_MAX文件
#include 
#include//for unique_ptr shared_ptr
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA(x) cout << x << endl;
#define lowbit(x) x & -x
const int maxn = 1e6 + 10;
int n, m, k, d, T = 1, A, B;

templatevoid read(T &x) {
    T f = 1;x = 0;char s = getchar();
    while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
    while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
    x *= f;
}

templatevoid print(T x) {
    if(x < 0) putchar('-'),x = -x;
    if(x > 9) print(x / 10);
    putchar(x % 10 + '0');
    putchar('\n');
}
constexpr int Init(int x)
{
	return x * 2;
}

/*
给定整数 u 和 v(0≤ u,v ≤ 10e18
试构造长度最短的数组,使得数组内所有元素的异或和为 u,加和为 v。
如果有解,输出两行
第一行输出一个整数 n,
第二行输出 n 个非负整数,表
示数组里的元素。多解输出任意一组即可。
如果无解,输出 −1。
*/

/*
异或的基本性质:
对于任意的两个布尔值a和b,a^b的结果为真(1),当且仅当a和b的值不相等。也就是说,如果a和b的值相等,那么a^b的结果为假(0)。
异或的交换律:对于任意的两个布尔值a和b,a^b的结果与b^a的结果相等。也就是说,异或运算满足交换律。
异或的结合律:对于任意的三个布尔值a、b和c,(a^b)^c的结果与a^(b^c)的结果相等。也就是说,异或运算满足结合律。
异或的自反性:对于任意的布尔值a,a^a的结果为假(0)。也就是说,如果两个值相同,它们的异或结果为假。
异或的零元素:对于任意的布尔值a,a^0的结果等于a。也就是说,任何值与0进行异或运算,结果等于它本身。
异或的一对一对消对于任意的布尔值a和b,如果a^b的结果等于c,那么a^c的结果等于b,b^c的结果等于a。也就是说,如果a和b的异或结果为c,那么c与a进行异或运算得到b,c与b进行异或运算得到a。
*/

void solve()
{
	//异或最大可取 a ^ b <= a + b == >> 若u > v必定无解
	//对于一对合法 u v 根据异或的自反性,至少可以构造出一个len == 3的合法序列
	//即取出一个u 俩个 (v - u) / 2必然符合要求
	//若v - u为奇数那么就无法利用异或自反性来构造答案
	//因为奇数 - 奇数 = 偶数 .偶数 - 偶数 = 偶数 == >> 因此当u ,v奇偶不同时也不是合法状态
	//对于一个合法序列 u t t 其中t == (v - u) / 2
	//根据异或的结合律 如果此时 u ^ t ^ t == (u ^ t) ^ t 若(u ^ t) == 0时
	//根据(任何值与0进行异或运算,结果等于它本身)的特性 以及 (u ^ t) == 0的先天条件可以推出一个更优解 (u + t) t
	auto x = make_unique();
	int u, v;
	cin >> u >> v;
	if(u > v || (u & 1) != (v & 1))cout << -1 << endl;
	else if(u == v) u ? cout << 1 << endl << u << endl : cout << 0 << endl;
	else
	{
		int t = (v - u) / 2;
		if(((u + t) ^ t) == u)cout << 2 << endl << u + t << " " << t << endl;
		else cout << 3 << endl << u << " " << (v - u) / 2 << " " << (v - u) / 2 << endl;
	}
}

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    int T = 1;
   	//read(T);
    while (T--) solve();
    return 0;
}

你可能感兴趣的:(cf,洛谷题目集,c++)