Just do it
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1047 Accepted Submission(s): 606
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
Source
Recommend
liuyiding | We have carefully selected several similar problems for you: 6132 6131 6130 6129 6128
题目描述: 将a序列转化成b序列, b[i] = a[1]^a[2]^a[3]^a[4]^......^a[i] 重复m次, 求b
解题思路: 我开始找的是系数的规律发现他满足杨辉三角, 也就是说我现在给出n 和 m , 然后求最后一项是奇数还是偶数, 然后自己就死推呀, 推了两个多点儿把所有的表都打遍了也没找到规律.....其实是有公式的......: C(x+y-2, y-2) 表示第i项循环y次的杨辉三角最上端的数, 而我们只关心这个数的奇偶, 如果是奇数我们就向下传递
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
typedef long long ll;
using namespace std;
//const int INF = 0x3fffffff;
const int maxn = 2e6 + 10;
int a[maxn];
int ans[maxn];
int main() {
int t;
scanf( "%d", &t );
while( t-- ) {
int n, m;
scanf( "%d %d", &n, &m );
mem0(a);
mem0(ans);
for( int i = 1; i <= n; i++ ) {
scanf( "%d", a+i );
}
for( int i = 1; i <= n; i++ ) {
int x = m+i-2;
int y = i-1;
if( (x & y) == y ) {
for( int j = 1; j <= n; j++ ) {
ans[j] ^= a[j-i+1];
}
}
}
// cout << n << endl;
for( int i = 1; i <= n; i++ ) {
if( i == 1 ) {
printf( "%d", ans[i] );
}
else printf( " %d", ans[i] );
}
printf( "\n" );
}
return 0;
}