#luoguP9227. 异或积
异或积
本题没有可用的提交语言。
题目背景
小 H 在课堂上学习了异或运算。
对于两个非负整数 ,它们的异或是指,将它们作为二进制数,对二进制表示中的每一位进行如下运算得到的结果:
- 和 的这一位上不同时,结果的这一位为 ;
- 和 的这一位上相同时,结果的这一位为 。
和 的异或被记为 或 。
在 C++ 中,你可以用 x ^ y
得到 与 的异或值。
另外,若干个数的异或称之为异或和。
题目描述
小 H 还了解到,一个长度为 的数列 的异或积是一个等长的数列 ,其中 等于数列 中除了 以外其他元素的异或和,即
例如,数列 的异或积为 。
异或积变换是指将一个数列用它的异或积替换的过程,由于异或积变换之后数列长度不变,所以异或积变换可以连续进行多次。
现在,小 H 有一个长度为 的数列 ,他想请你帮他计算出 经过 次异或积变换之后得到的序列。
输入格式
本题单个测试点内有多组测试数据。
第一行一个整数 ,表示测试数据组数。
对于每一组测试数据:
第一行两个整数 。
第二行 个整数 。
输出格式
对于每一组测试数据:
一行 个整数,表示数列 经过 次异或积变换之后得到的数列。
1
4 1
1 2 3 4
5 6 7 0
1
4 2
0 0 0 1
0 0 0 1
见附件中的 samples/xor3.in
见附件中的 samples/xor3.ans
提示
样例 1 解释
此样例即为题目描述中的例子。
样例 2 解释
第 次异或积变换:;
第 次异或积变换:。
数据规模与约定
对于 的测试数据,,,,。
测试点编号 | 特殊性质 | ||
---|---|---|---|
中所有数的异或和为 | |||
为奇数 | |||
为偶数 | |||
提示
在 C++ 中,对于数据范围 ,你可以:
- 使用
unsigned int x
来定义; - 使用
cin >> x
或scanf("%u", &x)
来输入; - 使用
cout << x
或printf("%u", x)
来输出。