题意:
设b[i] = a[1]^a[2]^a[3]^..................a[i];
每进行一次,a数组会变成一个b数组。问进行m次的结果。
思路:
写出前几项的前几次结果,结果以每个元素的及其用到的个数显示。然后把a[1]的个数抽象出来,会发现是一个斜着的杨辉三角,a[2]则是a[1]的杨辉三角整体向右移一位。所以我们就能得到第m行第j列的元素a[1]的系数是C(m+j-2, j-1)。
然后再通过观察第m行其它列的各个元素的系数,会发现从当前列中元素a[1]的系数,等于下一列的a[2]的系数,等于下下一列的a[3]的系数...
之后需要根据Lucas定理的推广快速判断一个组合数值的奇偶性,其实就是一个式子(n&m) == m?是为奇否为偶。也可以用代码中的方法。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int a[maxn], b[maxn];
int isodd(int n, int m)
{
while(m)
{
if((m&1) && !(n&1)) return 0;
m >>= 1, n >>= 1;
}
return 1;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, m, 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)
{
if(isodd(m+i-2, i-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;
}
继续加油~