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;
    }
    
  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7371746.html
Copyright © 2011-2022 走看看