题目链接
题意
对一个求m次前缀异或和,求这个数列。
思路
我们找一下规律,发现将这个东西列出来之后,对角线上的数字都是组合数。不同数字产生贡献的位置是这些组合数为奇数的位置。
那么我们可以去计算这些组合数是奇数还是偶数,如果为奇数,那么所有数字都会对对应偏移位置产生贡献。
怎么计算一个很大的组合数是奇是偶呢?介绍两种方法。
可以把它拆成阶乘的形式,分别计算分子分母有多少个2因子,相减一下。
也可以考虑模2情况下的卢卡斯定理,变成分解其二进制。
两种方法复杂度均为.
Code
1 |
|
对一个求m次前缀异或和,求这个数列。
我们找一下规律,发现将这个东西列出来之后,对角线上的数字都是组合数。不同数字产生贡献的位置是这些组合数为奇数的位置。
那么我们可以去计算这些组合数是奇数还是偶数,如果为奇数,那么所有数字都会对对应偏移位置产生贡献。
怎么计算一个很大的组合数是奇是偶呢?介绍两种方法。
可以把它拆成阶乘的形式,分别计算分子分母有多少个2因子,相减一下。
也可以考虑模2情况下的卢卡斯定理,变成分解其二进制。
两种方法复杂度均为.
1 | #include <bits/stdc++.h> |