hdu6129Just do it(杨辉三角、组合数)

来源:互联网 发布:公司网络管理办法 编辑:程序博客网 时间:2024/05/22 10:23

题意:

有一个长度为n的整数序列{an},对其做m次前缀异或和,求最终的序列。

思路:

看了别人的题解。发现第i次变化后,a[1]对b[j]的贡献其实是个杨辉三角。贡献次数是C(i+j-2,j-1)(在三角上推一下),然后根据lucas定理(n&m==m?奇:偶)来判断C(n,m)的奇偶性。

然后又发现a[2]对b[j]的贡献其实就是a[1]的杨辉三角往右挪了一格,所以知道了a[1]对b的贡献,后面的a[2],a[3]···对b的贡献就都知道了

代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 200000+7;int a[maxn],b[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        for(int i = 1;i<=n;i++)            scanf("%d",&a[i]);        memset(b,0,sizeof(b));        for(int i = 1;i<=n;i++)        {            int nn = m+i-2,mm = i-1;            if((nn&mm)==mm)            {                for(int j = 1;j<=n-i+1;j++)                    b[j+i-1] ^= a[j];            }        }        for(int i = 1;i<n;i++)            printf("%d ",b[i]);        printf("%d\n",b[n]);    }    return 0;}

原创粉丝点击