HDU6129 Just do it(前缀异或+杨辉三角)

来源:互联网 发布:gtx1070 gpu数据 编辑:程序博客网 时间:2024/06/08 11:19
/*前缀异或+杨辉三角给定一个数组,求m次前缀和异或的结果Lucas定理,C(a,b)是奇数当且仅当把a,b二进制表达后b中1的位置是a中1的位置的子集如果对于两个数n、m,如果(n&m)==m,那么C(n,m)为奇数,否则为偶数。考虑第一个数对后面的贡献次数第一次: 1 0 0 0 0 第二次: 1 1 1 1 1 第三次: 1 2 3 4 5 第四次: 1 3 6 10 15第i个数在第j行的第i+k列的贡献度为C(j+k-2,j-1)次,杨辉三角根据XOR规律,如果为奇数次相当于一次贡献,偶数次没有贡献。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=2e5+5;int a[maxn];int b[maxn];int n,m;int main(){    int t;    scanf("%d",&t);    while(t--)    {        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=m+i-2;            int y=i-1;            if((x&y)==y)//如果C(j+k-2,j-1)为奇数            {                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?'\n':' ');        }   }   return 0;}