dp(i, j)表示第i次变换第j列的数。
dp(i, j) = dp(i, j-1)^dp(i-1, j) = dp(i, j-2)^dp(i-1, j-1)^dp(i-1, j-1)^dp(i-2, j) = dp(i, j-2)^dp(i-2, j) => dp(i, j-2^n)^dp(i-2^n, j)
从m中的最高位或最低位开始递推。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int dp[N];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", dp+i);
while(m) {
int x = m&-m;
for(int j = x; j < n; j++) {
dp[j] ^= dp[j-x];
}
m -= x;
}
for(int i = 0; i < n; i++) printf("%d%c", dp[i], i==n-1?'\n':' ');
}
return 0;
}