题意:找序列的m次前缀异或和
思路:可以发现做m次后,位置为x的初始值对位置为y的最终值的贡献次数是一个只和m与y-x相关,将n次数列前缀异或拆开然后每一个位置只用01表示就可以发现2的k次方除了最后一个需要被当前异或其他都不要
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,m,k;
int a[200005];
main() {
scanf("%d",&T);
while (T--) {
scanf("%d%d",&n,&m);
k = 1;
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
while(k * 2 <= m)
k = k * 2;
while(m > 0){
while(m >= k){
for(int i = k + 1; i <= n; i++)
a[i] = a[i] ^ a[i - k];
m = m - k;
}
k = k / 2;
}
for(int i = 1; i <= n; i++){
if(i != n)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
}
}