Miraclys

一言(ヒトコト)

CF1270C Make Good

\(\large{题目链接}\)
\(\\\)

题意:

\(t\)组询问,每组给出一个\(n\)个元素的序列,最多在这个序列中添加3个元素使得整个序列的和为异或和的二倍。
\(1 \leq t \leq 10^4, 1 \leq n \leq 10^5\)
\(\\\)

思路:

一道思维题。
多试几个数据,会发现,可以先求出最初的和\(s\)与异或和\(x\)
然后在序列中添加\(x\),那么异或和就变为了0,这时再在序列中添加当前的和\(s+x\)即可。
\(\\\)

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

void solve() {
	int n, a;
	ll s = 0, x = 0;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a;
		s += a;
		x ^= a;
	}
	cout << "2" << endl << x << " " << s + x << endl;
}

int main() {
	int t;
	cin >> t;
	for (; t; --t) solve();
	return 0;
}
posted @ 2020-04-26 15:59  Miraclys  阅读(170)  评论(0编辑  收藏  举报

关于本博客样式

部分创意和图片借鉴了

BNDong

的博客,在此感谢