hdu6129

来源:互联网 发布:我知你好 未再91baby 编辑:程序博客网 时间:2024/06/05 04:15

题意:找序列的m次前缀异或和

思路:可以发现做m次后,位置为x的初始值对位置为y的最终值的贡献次数是一个只和m与y-x相关,将n次数列前缀异或拆开然后每一个位置只用01表示就可以发现2的k次方除了最后一个需要被当前异或其他都不要

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int T,n,m,k;int a[200005];main() {        scanf("%d",&T);    while (T--) {        scanf("%d%d",&n,&m);        k = 1;        for(int i = 1; i <= n; i++)            scanf("%d",&a[i]);        while(k * 2 <= m)            k = k * 2;        while(m > 0){            while(m >= k){                for(int i = k + 1; i <= n; i++)                    a[i] = a[i] ^ a[i - k];                m = m - k;            }            k = k / 2;        }        for(int i = 1; i <= n; i++){            if(i != n)                printf("%d ",a[i]);            else                printf("%d\n",a[i]);        }    }}

原创粉丝点击