Just do it
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1420 Accepted Submission(s): 831
Problem Description
There is a nonnegative integer sequence
a
1...n![]()
of length
n
. HazelFan wants to do a type of transformation called prefix-XOR, which means
a
1...n![]()
changes into
b
1...n![]()
, where
b
i![]()
equals to the XOR value of
a
1
,...,a
i![]()
. 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×10
5
,1≤m≤10
9
)
.
The second line contains n
nonnegative integers
a
1...n
(0≤a
i
≤2
30
−1)
.
For each test case:
The first line contains two positive integers n,m(1≤n≤2×10
The second line contains n
Output
For each test case:
A single line contains n
nonnegative integers, denoting the final sequence.
A single line contains n
Sample Input
2 1 1 1 3 3 1 2 3
Sample Output
1 1 3 1
Source
Recommend
打表找规律,发现他们的系数如下:
1 1 1 1 1 1 1
2 1 2 3 4 5 6
3 1 3 6 10 15 21
4 1 4 10 20 35 56
5 1 5 15 35 70 126
..............................................
..............................................
i .......c(m+i-2,i-1).................
发现他们的系数是杨辉三角
我们只需要系数的奇偶,c(m,n) :if((m&n)==n) 则c(m,n)是一个奇数,一个组合数的性质
代码如下:
#include<stdio.h>
#include<string.h>
const int N=2*1e5+5;
int a[N],b[N];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
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 mm=m+i-2,nn=i-1;
if((mm&nn)==nn)
{
for(int j=i;j<=n;j++)
{
b[j]^=a[j-i+1];
}
}
}
for(int i=1;i<=n;i++)
{
if(i==1)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
puts("");
}
return 0;
}