HDU6129 Just do it

来源:互联网 发布:传奇mac 编辑:程序博客网 时间:2024/06/07 04:10

题目

Just do it

Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1090    Accepted Submission(s): 629


Problem Description
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.
 

Input
The first line contains a positive integer T(1T5), denoting the number of test cases.
For each test case:
The first line contains two positive integers n,m(1n2×105,1m109).
The second line contains n nonnegative integers a1...n(0ai2301).
 

Output
For each test case:
A single line contains n nonnegative integers, denoting the final sequence.
 

Sample Input
21 113 31 2 3
 

Sample Output
11 3 1

题目大意


  b[i]=a[1]^a[2]^....^a[i],所有的b[i]更新完之后,b[i]变成新的a[i],重复m次,让我们输出b[i],

  动手写一下可以发现是一个杨辉三角,C(m-1,m-1+i) i∈(0,n-1)

ma1a2a3a41a1a1^a2a1^a2^a3a1^a2^a3^a42a12^13^2^14^3^2^13a13^16^3^110^6^3^1
第二行开始我直接写的平方数,省略了a1,a2,a3,a4,对应一下就好

拿m=3时的a4举例,C(m-1,m-1+i),从右边开始,i=0,有一个a4,i=1,C(m-1,m-1+1)=C(2,3)=3,三个a3,C(m-1,m-1+2)=C(2,4)=6,6个a2.....

刚开始就想到Lucas,但是超时了,这里有一个结论,(m-1)&(m-1+i)==(m-1),那么这个组合数是奇数,我们异或的也只有奇数。


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=200000+10;int a[maxn];int b[maxn];int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(b,0,sizeof(b));        int n,m;        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)          {            scanf("%d",&a[i]);          }        for(int i=0;i<n;i++)        {           // int t=(m-1)&(m-1+i);           // cout<<m-1<<"  "<<m-1+i<<" "<<t<<endl;            if(((m-1)&(m-1+i))==(m-1))//这里是一种优化,很强大,orz            for(int j=i+1;j<=n;j++)            {                b[j]^=a[j-i];               // cout<<"b["<<j<<"] : "<<b[j]<<" a["<<j-i<<"] : "<<a[j-i]<<endl;            }        }        printf("%d",b[1]);        for(int i=2;i<=n;i++)        {            printf(" %d",b[i]);        }        printf("\n");    }    return 0;}



原创粉丝点击