题目
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.
输入
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).
输出
For each test case:
A single line contains n nonnegative integers, denoting the final sequence.
样例输入
2
1 1
1
3 3
1 2 3
样例输出
1
1 3 1
Hint
借用别人博客的一张图:
由图中的规律发现这是一个杨辉三角,其中x = m + i - 2 , y = i - 1 。 我们不必把组合数的具体值算出,由于题目是异或运算,故只要知道组合数的奇偶性即可。若((x & y) == y ), 则组合数为奇数,反之则为偶数(Lucas定理)。
#include<bits/stdc++.h>
using namespace std ;
typedef pair<int , int> P ;
typedef long long LL ;
const int INF = 0x3f3f3f3f ;
int a[200000 + 10 ] , b[200000 + 10];
int main(){
int T ;
scanf("%d",&T);
while( T --){
int n , m ;
scanf("%d %d",&n,&m) ;
memset(b,0,sizeof(b)) ;
for(int i = 1 ;i <= n ;i ++){
scanf("%d",&a[i]) ;
}
for(int i = 1 ;i <= n ; i++){
int x = m + i - 2 ;
int y = i - 1 ;
if((x & y ) == y){
int t = 1 ;
for(int j = i ; j <= n ; j++){
b[j] ^= a[t++] ;
}
}
}
for(int i = 1 ; i <= n ; i++){
printf("%d%c",b[i],i == n ? '\n': ' ') ;
}
}
return 0;
}