CF1270C Make Good 题解

一道水构造题。

题目翻译:

给你一个数列,让你在其中插入最多 \(3\) 个数字当然也可以不插入,使得这些数字的总和等于异或的2倍,只要给出任何一种方案即可。

解题思路:

先来看一下异或

将一个数转换成二进制后异或。

  • \(1 \oplus 1= 0\)

  • \(0 \oplus 0= 0\)

  • \(1 \oplus 0= 0\)

  • \(1 \oplus 1= 0\)

显然,可以得到两个式子:

  • \(x \oplus x=0\)

  • \(0 \oplus x=x\)

知道了这两个式子就很简单了。

首先定义两个变量分别记录异或后的值和整个数列和。

然后将异或后的值再异或自己,得到 \(0\)

最后再异或一下原数列异或后的值加整个数列的和。

这样就完成了题目要求。

不过为什么呢?

我们来统计一下加了数字后的数列包含什么:

  • 第一部分:原数列的和

  • 第二部分:原数列异或的值

  • 第三部分:原数列异或的值加原数列的和

所以总共包含了 \(2\) 个原数列的和以及 \(2\) 个原数列异或的值。

所以得到的结果就是上面的一半。

参考代码:

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

signed main()
{
	int T,n,ans,x,cnt;
	cin>>T;
	while(T--){
		ans=0;
		cnt=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>x;
			ans^=x;
			cnt+=x;
		}	
		cout<<2<<endl<<ans<<" "<<(cnt+ans)<<endl;
	}
	return 0;
}

posted @ 2021-11-18 12:38  iFear  阅读(40)  评论(0)    收藏  举报
Live2D