[题解]2017 多校7 — Just do it

来源:互联网 发布:js时间倒计时代码 编辑:程序博客网 时间:2024/06/06 05:12

题目

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;}
原创粉丝点击