zoukankan      html  css  js  c++  java
  • 2017ACM暑期多校联合训练

    题目链接

    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×10^5,1≤m≤10^9).
    The second line contains n nonnegative integers a1...n(0≤ai≤2^30−1).

    Output
    For each test case:
    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

    题意:

    给定一个数组a,然后要求出数组b,数组b于数组a之间满足这样的规律:
    b[i]=a[1]^a[2]^·····^a[i].

    像这样的话其实是很简单的,但是我们并不是要求第一次异或得出的数组b,而是要求经过m次异或之后得出的数组b。

    分析:
    首先找一下规律:(都与最原始的a数组进行比较)
    异或第一次的时候:
    每一项相当于都把它前面的任意的一项全部都异或上了。

    然后再观察异或第二次的时候:
    相当于每一项都是差项异或,异或上前面所有的中与它本身相差两项、四项、六项、八项····等等。

    异或第三次的时候:
    相当于每一项都是差项异或,异或上前面所有的中与它本身相差一项、四项、五项、八项····等等。

    然后总结下规律就是:
    把每次变换的系数记录下来后可以发现是个杨辉三角,第x次变换第y项是C(x+y-2,y-1);
    C(n,m),如果n&m==m则C(n,m)为奇数,考虑第一项对后面每一项的贡献是奇数还是偶数,
    依次类推后面的项数产生的贡献情况

    代码:

    #include <iostream>
    #include <cstdio>
    #include<string.h>
    using namespace std;
    const int N = 2e6+10;
    int a[N], b[N];
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--)
        {
            int n, m;
            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++)///第m次异或第i项的时候
            {
                int nn=m+i-2,mm=i-1;
                if((nn&mm)==mm)
                {
                    for(int j=i; j<=n; j++)  b[j]^=a[j-i+1];
                }
            }
            for(int i=1; i<=n; i++) printf("%d%c",b[i],i==n?'
    ':' ');
        }
        return 0;
    }
    
  • 相关阅读:
    Ajax
    Guitar and Music Theory
    leetcode62 不同路径(Medium)
    leetcode49 字母异位词分组(Medium)
    leetcode3 无重复的最长子串(Medium)
    leetcode69 x的平方根(Easy)
    leetcode300 最长上升子序列(Medium)
    leetcode240 搜索二维矩阵II (Medium)
    leetcode34 在排序数组中查找元素的第一个和最后一个位置(Medium)
    leetcode31 下一个排列(Medium)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7371746.html
Copyright © 2011-2022 走看看