题目
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(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:
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) .
Output
For each test case:
A single line contains n nonnegative integers, denoting the final sequence.
A single line contains n nonnegative integers, denoting the final sequence.
Sample Input
2 1 1 1 3 3 1 2 3
Sample Output
1 1 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)
m | a1 | a2 | a3 | a4 |
1 | a1 | a1^a2 | a1^a2^a3 | a1^a2^a3^a4 |
2 | a1 | 2^1 | 3^2^1 | 4^3^2^1 |
3 | a1 | 3^1 | 6^3^1 | 10^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;
}