2017 Multi-University Training Contest

来源:互联网 发布:清远数据库工程师招聘 编辑:程序博客网 时间:2024/06/05 15:57

http://acm.hdu.edu.cn/showproblem.php?pid=6129


题意:

  对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^……^ai,这样得到序列b,重复这样的操作m次,每次都是从上次求出的序列a得到一个新的序列b,给定初始的序列,求重复m次操作后的到的序列。

思路:

  计算dp[i][j]=dp[i2n][j] ^dp[i][j2n],用lowbit从右往左枚举m的每一位,每一次都对整列进行更新。

代码:

#include<bits/stdc++.h>using namespace std;#define ll long longll a[1000005];int main(){    ll T;    ll n,m;//    printf("%d\n",3 ^ 3);    while(~scanf("%lld",&T)){        while(T--){            scanf("%lld %lld",&n,&m);            for(ll i = 0;i < n;i++){                scanf("%lld",&a[i]);            }            while(m){                ll x = m & -m;                for(ll i = x;i < n;i++){                    a[i] = a[i] ^ a[i - x];                }                m -= x;            }            for(ll i = 0;i < n;i++){                if(i){                    printf(" ");                }                printf("%lld",a[i]);            }            printf("\n");        }    }}
原创粉丝点击