借用别人博客的一张图。
只需要计算出每个贡献的奇偶即可,然后对于具有这个贡献的元素进行计算。
此外C(n, m)为奇数等价于n & m == m。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int a[N];
int b[N];
int n, m;
int main()
{
//freopen("test.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(b, 0, sizeof(b));
for (int i = 1; i <= n; i++)
{
int x = m + i - 2;
int y = i - 1;
if ((x & y) == y)
{
for (int j = i; j <= n; j++)
b[j] ^= a[j - i + 1];
}
}
for (int i = 1; i <= n; i++)
printf("%d%c", b[i], (i < n ? ' ' : '\n'));
}
return 0;
}