2017杭电多校第七场1010 Just do it(数论,杨辉三角)HDU 6129

来源:互联网 发布:javascript入门经典 5 编辑:程序博客网 时间:2024/05/18 17:42

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(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
 

Source
2017 Multi-University Training Contest - Team 7
 

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;}


原创粉丝点击