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;
}

浙公网安备 33010602011771号