Just do it
Problem Description
There is a nonnegative integer sequence a1...n of length n. HazelFan wants to do a type of transformation called prefix-XOR, which means a1...n changes into b1...n, where bi equals to the XOR value of a1,...,ai. He will repeat it for m times, please tell him the final sequence.Input
The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.For each test case:
The first line contains two positive integers n,m(1≤n≤2×105,1≤m≤109).
The second line contains n nonnegative integers a1...n(0≤ai≤230−1).
Output
For each test case:A single line contains n nonnegative integers, denoting the final sequence.
Sample Input
21 1
1
3 3
1 2 3
Sample Output
11 3 1
Source
2017 Multi-University Training Contest - Team 7
题意:给出长度为n的数组a,b[i]=a[1]^a[2]^...^a[i](^为异或),进行m次操作,输出最终序列b
题解:计算对于任意位置p的数,对位置p+1、p+2...p+n-1的贡献次数
m=1:1 1 1 1 1
m=2:1 2 3 4 5
m=3:1 3 6 10 15
m=4:1 4 10 20 35
得出规律:任意一个位置p对位置p+i的贡献次数为C(m+i-1,i)(n&m==m时,C(n,m)为奇数),遍历求结果即可
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<math.h>
#include<queue>
#define INF 1e9
using namespace std;
int a[200005];
int b[200005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
for(int i=1;i<n;i++)
{
int s=m+i-1;
if((i&s)==i)
{
for(int j=1;j+i<=n;j++)
b[j+i]^=a[j];
}
}
for(int i=1;i<=n;i++)
{
cout<<b[i];
if(i==n) cout<<endl;
else cout<<" ";
}
}
return 0;
}