小 H 在课堂上学习了异或运算。
对于两个非负整数 ,它们的异或是指,将它们作为二进制数,对二进制表示中的每一位进行如下运算得到的结果:
- 和 的这一位上不同时,结果的这一位为 ;
- 和 的这一位上相同时,结果的这一位为 。
和 的异或被记为 或 。
在 C++ 中,你可以用 x ^ y
得到 与 的异或值。
另外,若干个数的异或称之为异或和。
小 H 还了解到,一个长度为 的数列 的异或积是一个等长的数列 ,其中 等于数列 中除了 以外其他元素的异或和,即
例如,数列 的异或积为 。
异或积变换是指将一个数列用它的异或积替换的过程,由于异或积变换之后数列长度不变,所以异或积变换可以连续进行多次。
现在,小 H 有一个长度为 的数列 ,他想请你帮他计算出 经过 次异或积变换之后得到的序列。