hdu 6129(Just do it)
题目链接:Just do it
题目意思:
给你a数组,n个数。每次操作是\(b_i = a_1 \wedge a_2 \wedge a_3 \cdots a_{i-1} \wedge a_i\),再把b数组的数复制到a数组;重复进行m次。问最后b数组的数字,输出他。over
思路:
写下,下图。发现 每次操作中,都是左边的+上面的,和杨辉三角很像。
进一步,得到a1的系数矩阵
a2的系数矩阵
我们发现\(a_n\) 的系数矩阵就是把\(a_1\)的系数矩阵往右移对应次数。因为系数为奇数才会有贡献,所以判断\(C_n^m\)为奇数,\(a_1,a_2\cdots a_n\)的系数矩阵才为奇数,为答案贡献一次。
#include <stdio.h>
#include <string.h>
const int maxn=2e5+100;
int a[maxn],b[maxn];
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
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++)
{
int x=i-1;
int y=i+m-2;
if((x&y)==x) for(int j=i;j<=n;j++) b[j]^=a[j-i+1];
}
for(int i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",b[i]);
}
return 0;
}