其他题目题解:
2017 Multi-University Training Contest - Team 7:1005. Euler theorem
2017 Multi-University Training Contest - Team 7:1011. Kolakoski
2017 Multi-University Training Contest - Team 7:1008. Hard challenge
2017 Multi-University Training Contest - Team 7:1002. Build a tree
2017 Multi-University Training Contest - Team 7:1003. Color the chessboard
题意:有一个长度为n的整数序列,对其求m次前缀和,求最终的序列
令φ(x, y)为求完第x次前缀和后的第y个数,那么有
从这个公式可以得出两点:
①系数同于组合数
②系数为偶数的项值为0(异或性质a^a==0)
考虑对于组合数C(n,m),当n&m==m(m<n)时为奇数
那么可以得知当n为2^n形式的整数时,C(n,m)当且仅当m=0和m=n时为奇数,其它都为偶数
这样就可以得出
因为是求第m个序列
所以对于φ(m, y),对应着φ(m-2^k, y),我们就可以用m&-m不停的取掉m的最低位,
然后将m&-m+1到y这一段的所有数字全部异或它前面的第m&-m个数字就好
一开始写的递归超时了
#include<stdio.h>
int a[200005], ans[200005];
int main(void)
{
int T, n, m, k, i;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
while(m)
{
k = m&-m;
for(i=k+1;i<=n;i++)
a[i] ^= a[i-k];
m -= k;
}
printf("%d", a[1]);
for(i=2;i<=n;i++)
printf(" %d", a[i]);
printf("\n");
}
return 0;
}