思路见:http://blog.csdn.net/qq_32506797/article/details/77206167。
利用二进制讲m次转化成log次然后进行转移。
代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 const int N = 2e5 + 5; 6 7 int T, n, m, a[N]; 8 9 int main() 10 { 11 scanf("%d",&T); 12 while(T--) 13 { 14 scanf("%d%d",&n,&m); 15 for(int i=1;i<=n;i++) scanf("%d",a+i); 16 while(m) 17 { 18 int temp = m & -m; 19 for(int i=temp+1;i<=n;i++) a[i] ^= a[i-temp]; 20 m -= temp; 21 } 22 for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n?' ':' '); 23 } 24 return 0; 25 }