一个数组[a1,a2,…,am]为 good 的条件是 a1+a2+⋯+am=2⋅(a1⊕a2⊕⋯⊕am),其中 ⊕ 表示异或。
最多加上3个数(可以相同)使得数组为 good,任选一种方案输出。
Input
先输入样例数t(1≤t≤10000)。
然后,第一行为数组大小n(1≤n≤10^5)。
第二行输入数组里的n个数a1,a2,…,an (0≤ai≤10^9) 。
Output
每个样例第一行输入要加入数字的个数。
第二行输入添加的数。
Input
3
4
1 2 3 6
1
8
2
1 1
Output
0
2
4 4
3
2 6 2
利用异或的性质:对于任何数x,都有x^x=0,x^0=x 。
所以,先加上数组元素的异或值r。
这样数组元素之和变为sum+r。由于x^x=0,新的异或值变为0。
再加上sum+r。
这样数组元素之和变为2*(sum+r)。由于x^0=x, 新的异或值变为sum+r。满足题目要求。
#include<cstdio>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
long long x,sum=0,r=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%lld",&x);
sum+=x;
r^=x;
}
if(sum==2*r)
printf("0\n\n");
else
printf("2\n%lld %lld\n",r,sum+r);
}
}