您的位置:首页 > 其它

HDU 6129 Just do it(机智)

2017-09-26 16:12 363 查看
Description

给出一个序列a1,2,...,n,每次操作对该序列求一遍异或前缀和,问m次操作后的序列

Input

第一行一整数T表示用例组数,每组用例首先输入两个整数n和m分别表示序列长度和操作数,之后输入n个整数a1,2,...,n(1≤T≤5,1≤n≤2⋅105,1≤m≤109,0≤ai≤230−1)

Output

输出m次操作后的序列

Sample Input

2

1 1

1

3 3

1 2 3

Sample Output

1

1 3 1

Solution

设m次操作后的序列为b1,2,...,n,类似杨辉三角知ai对bj的贡献为Cj−im−1+j−i,而使得Ckm−1+k为奇数的k并不多,故可以枚举k,如果Ckm−1+k为奇数则枚举i,ai对bi+k有贡献

注:Cmn为奇数当且仅当n&m=m

Code

#include<cstdio>
using namespace std;
typedef long long ll;
#define maxn 200005
int T,n,m,a[maxn],ans[maxn];
int C(int n,int m)
{
if((n&m)==m)return 1;
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&a[i]),ans[i]=a[i];
for(int i=1;i<n;i++)
if(C(m+i-1,i))
for(int j=0;j+i<n;j++)
ans[j+i]^=a[j];
for(int i=0;i<n;i++)printf("%d%c",ans[i],i==n-1?'\n':' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: