本学期信奥课程即将结束了。叶老师准备了n个卡片,每个卡片上有一个非负整数。在游戏前,叶老师把卡片分给了大家,每人一张。游戏内容就是大家分成若干组,多少组,每组如何分你们可以根据卡片上的数字决定,但希望
(1)n个数中的每一个数都恰好被分到了一个组中,且每一组至少包含一个数。
(2) 定义一组数的权值为该组内所有数的异或和。希望所有组数的权值之和最小。
聪明的你能快速找到如何分组,满足要求吗?
输入
输入的第一行包含一个正整数n ,表示给定的非负整数的数量。
接下来一行包含n个非负整数a1,a2,...,an。
输出
输出一行一个整数表示答案。
样例输入 Copy
【样例输入1】 3 1 2 5 【样例输入2】 6 9 18 36 25 9 32
样例输出 Copy
【样例输出1】 6 【样例输出2】 15
提示
2个数异或,就是2个数都用二进制表示,然后对应位相同(都为0,或都为1)则该为异或后是0,对应位不同(一个是0,一个是1)则异或后该为为1,见下图
3和5异或C语言里写成3^5,多个数异或又称为异或和
【样例1解释】
一种最优的分组方案如下:
- 将第1个数和第3个数分为一组,该组的权值为 1^5=4
- 将第2个数分为一组,该组的权值为2
该分组方案的所有组的权值之和为4+2=6 ,可以证明,不存在权值之和更小的分组方案。
【样例2解释】
一种最优的分组方案如下:
- 将第1个数和第5个数分为一组,该组的权值为 9^9=0
- 将第2个数和第4个数分为一组,该组的权值为 18^25=11
- 将第3个数和第6个数分为一组,该组的权值为 36^32=4
该分组方案的所有组的权值之和为0+11+4=15 。可以证明,不存在权值之和更小的分组方案。
80% n<=15
100% n<=10^6,ai<=10^9
#include<stdio.h>
int main()
{
int n,i,he;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
he^=a[i];
}
printf("%d",he);
return 0;
}