0
点赞
收藏
分享

微信扫一扫

HDU 6129 just do it(组合数奇偶性)


Just do it点击打开链接


Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1411    Accepted Submission(s): 823



Problem Description


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


 



Input


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).


 



Output


For each test case:
A single line contains n


 



Sample Input


2 1 1 1 3 3 1 2 3


 



Sample Output


1 1 3 1


 



Source


2017 Multi-University Training Contest - Team 7 


【分析】:

if((n&m)==m) 奇数

else     偶数

m次操作之后,只需计算每个元素对后面元素的贡献。

若贡献为偶数次,由于是亦或,可忽略

若贡献为奇数次,那么只需亦或一次。

试着写了写m=1,2,3,4,....的时候,得出规律:

第一个元素对第i个元素的贡献次数为C(i+m-2,m-1)我们只用到他的奇偶性。

【代码】:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int a[202020],b[202020];
int e[202020];
int T,n;
ll h;
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>h;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int top=0;
        ll x=h-1,y=h-1;
        for(int i=1;i<=n;i++,x++)
        {
            if((x&y)==y)e[top++]=i;//i点组合数为奇数
        }
        memset(b,0,sizeof(b));
        for(int i=1;i<=n;i++)
        {
            for(int j=0; i+e[j]-1<=n&&j<top; j++)
                b[i+e[j]-1]^=a[i];
            if(i<n)
                printf("%d ",b[i]);
            else printf("%d\n",b[i]);
        }
    }
	return 0;
}



举报

相关推荐

0 条评论