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;
}
posted @ 2017-08-17 09:16  Code-dream  阅读(131)  评论(0编辑  收藏  举报