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

题目

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值