#P9227. 异或积

    ID: 10354 远端评测题 1000ms 128MiB 尝试: 0 已通过: 0 显示难度普及− 上传者: 标签>数学2023O2优化位运算洛谷月赛

异或积

背景

id: 4d7e\texttt{id: 4d7e}

小 H 在课堂上学习了异或运算。

对于两个非负整数 x,yx,y,它们的异或是指,将它们作为二进制数,对二进制表示中的每一位进行如下运算得到的结果:

  • xx 和 yy 的这一位上不同时,结果的这一位为 11;
  • xx 和 yy 的这一位上相同时,结果的这一位为 00。

xx 和 yy 的异或被记为 xxor⁡yx \operatorname{xor} y 或 x⊕yx \oplus y。

在 C++ 中,你可以用 x ^ y 得到 xx 与 yy 的异或值。

另外,若干个数的异或称之为异或和。

题目描述

小 H 还了解到,一个长度为 nn 的数列 aa 的异或积是一个等长的数列 bb,其中 bib_i 等于数列 aa 中除了 aia_i 以外其他元素的异或和,即

bi=⨁j=1n[j≠i]ajb_i = \bigoplus \limits_{j = 1}^{n} [j\ne i] a_j

例如,数列 {1,2,3,4}\{1, 2, 3, 4\} 的异或积为 {5,6,7,0}\{5, 6, 7, 0\}。

异或积变换是指将一个数列用它的异或积替换的过程,由于异或积变换之后数列长度不变,所以异或积变换可以连续进行多次。

现在,小 H 有一个长度为 nn 的数列 aa,他想请你帮他计算出 aa 经过 kk 次异或积变换之后得到的序列。

输入格式

本题单个测试点内有多组测试数据。

第一行一个整数 TT,表示测试数据组数。

对于每一组测试数据:

第一行两个整数 n,kn,k。

第二行 nn 个整数 a1,a2,⋯ ,ana_1,a_2,\cdots,a_n。

输出格式

对于每一组测试数据:

一行 nn 个整数,表示数列 aa 经过 kk 次异或积变换之后得到的数列。

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 解释

第 11 次异或积变换:{0,0,0,1}→{1,1,1,0}\{0,0,0,1\}\to\{1,1,1,0\};

第 22 次异或积变换:{1,1,1,0}→{0,0,0,1}\{1,1,1,0\}\to\{0,0,0,1\}。

数据规模与约定

对于 100%100\% 的测试数据,1≤T≤101 \le T \le 10,2≤n≤1052 \le n \le 10^5,1≤k≤10181 \le k \le 10^{18},0≤ai<2320 \le a_i < 2^{32}。

测试点编号 n≤n\leq k≤k \leq 特殊性质
1∼31 \sim 3 100100
4∼54 \sim 5 10001000
6∼76 \sim 7 33 101810^{18}
8∼108 \sim 10 10510^5 33
11∼1311 \sim 13 101810^{18} aa 中所有数的异或和为 00
14∼1514 \sim 15 nn 为奇数
16∼1716 \sim 17 nn 为偶数
18∼2018 \sim 20

提示

在 C++ 中,对于数据范围 0≤x<2320\le x<2^{32},你可以:

  • 使用 unsigned int x 来定义;
  • 使用 cin >> x 或 scanf("%u", &x) 来输入;
  • 使用 cout << x 或 printf("%u", x) 来输出。