hdu6129(二)

xiaoxiao2021-02-28  65

题目链接

题目意思

给你一个包含n个数的序列A和一个数m,序列B中的数是序列A经过异或得到的,比如:b[i]=a[1]^a[2]^…..^a[i]。现在让你求经过m次异或后,序列B的值。

解题思路

我们写下其前五项的值可以发现我们设定ans【i】【j】表示进行到第i次,第j个位子的答案的话,ans【i】【j】有推导式:

ansi】【j】=ansi-1】【j】^ansi】【j-1】; 1 1

从图中我们可以看出对于每一项,他的系数就是杨辉三角的值,那么如果当前位子系数为奇数的话,结果就会有贡献。

对于杨辉三角,第x次变换第y项是C(x+y-2,y-1); C(n,m),如果n&m==m则C(n,m)为奇数,考虑第一项对后面每一项的贡献是奇数还是偶数,依次类推后面的项数产生的贡献情况。

具体情况看代码吧!

代码部分

#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; int a[2050000]; int b[2050000]; int main() { int t; scanf("%d",&t); while(t--) { 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 y=i-1; int x=i+m-2; if((x&y)==y)///判断为奇数 { for(int j=i; j<=n; j++) b[j]^=a[j-i+1]; } } for(int i=1; i<=n; i++) { if(i>1) printf(" "); printf("%d",b[i]); } printf("\n"); } } 1234567891011121314151617181920212223242526272829303132333435363738 1234567891011121314151617181920212223242526272829303132333435363738
转载请注明原文地址: https://www.6miu.com/read-52968.html

最新回复(0)