XorCards

作者:熊云帆 汪乐平

关键字:解方程组,高斯消元 线性基

题目简述

​ 输入一个含有个元素的可重集以及一个非负整数。求集合有多少个子集满足集合中所有元素的异或和不大于小于等于,集合中的元素和小于等于

算法一

​ 答案可由两部分组成:

  1. 异或和等于的方案数
  2. 异或和小于的方案数

异或和等于的方案数

​ 对于异或和等于的方案数,我们可以设表示所取得子集中是否包含第个元素,设表示第个数的第个二进制位,设表示m的第个二进制位。

​ 可得方程:

​ 该方程的每一个解即对应一个合法的子集。

异或和小于的方案数

​ 对于异或和小于的方案数,设的前个二进制位和相同。

  • 的第个二进制位是时,的第位只能是,此时无法确定的大小关系。

  • 的第个二进制位是时,若的第位是,则一定小于。若的第位是,则不一定小于

    对于一定小于的情况,我们可以根据已经确定的位列出方程求出解的个数。对于不一定小于的情况,继续枚举下一位求解。

    即我们只需要在中为的二进制位统计答案即可。

解方程的时间复杂度是的,一共要解次方程。所以总的时间复杂度是

时间复杂度:

算法二

直接用bitset优化高斯消元可以使得解方程的复杂度降到

时间复杂度:

算法三

都有高斯消元和bitset了怎么可能想不到线性基呢……

求出原数组的线性基,这里的线性基必须消到每一位上最多只有。把被消出来的加回去再按升序排序,于是我们得到一个个数的单调不降的数组。数组满足两个性质:

原数组所有子集的异或和组成的多重集等于数组所有子集的异或和组成的多重集。

对于,都满足在异或和第小的的子集内的充要条件是,这里的指按位与。

于是我们可以使用按位枚举的方法快速地求出最大的满足。然后因为这里没有考虑空集,所以答案就是

求线性基的时间复杂度是,计算答案的时间复杂度是,所以总的时间复杂度就是

results matching ""

    No results matching ""