每次操作可以选取两个已有的数字标记进行逻辑与,并将结果加入集合。由于新值可以反复参与运算,最终可达的任意标记,必然可以表示为初始标记的某个非空子集的按位与结果。因此,问题转化为:
在数值范围 [0,1023] 内,统计有多少个整数 mask 能够被表示为至少一个初始标记的非空子集的按位与。
可达判定方法
若一个 mask 可以由某个子集按位与得到,则该子集中的每个标记都必须包含 mask 的所有 1 位,即 (mark&mask)=mask。设 S(mask) 为所有满足此条件的初始标记的集合。如果 S(mask) 非空,并且 S(mask) 中所有元素的按位与结果恰好等于 mask,那么 mask 就是可达的。
给定一组初始的“数字标记”,每个标记是一个 10 位二进制数,取值范围在 0 到 1023 之间。 你可以进行任意次操作:从当前已有的标记中任选两个(可以相同),计算它们的“逻辑与”结果——对于每一位,仅当两个标记在该位都是 1 时,结果位才是 1,否则为 0。将得到的新标记加入当前集合。新标记可以继续参与后续操作。 问:通过任意次操作,最终集合中最多能包含多少个互不相同的标记?
约束条件:
第一行包含一个整数 T,表示测试用例的组数。 接下来依次描述每组测试数据。每组数据占两行: 第一行包含一个整数 n,表示初始标记的个数。 第二行包含 n 个整数,表示初始标记的数值。 数据保证满足题面给出的范围约束。
对于每组测试数据,输出一行一个整数,表示通过操作最终能获得的不同标记的最大数量。
输入
1
1
5
输出
1
说明
初始只有一个标记 5(二进制 1012)。任何操作 5&5 的结果仍然是 5,无法生成新的标记。因此最终集合中不同标记的数量为 1。
输入
1
2
3 5
输出
3
说明
初始有两个标记:3(0112)和 5(1012)。
计算 3&5 得到 1(0012),这是一个之前没有的新标记。
至此集合包含 1、3、5。无论再对哪些标记进行按位与操作(例如 1&3=1,1&5=1,3&3=3),都只能得到这三个数之一。因此最终不同标记的数量为 3。
输入
1
10
1 2 4 8 16 32 64 128 256 512
输出
11
说明
初始包含全部 10 个 2 的幂:1,2,4,8,…,512(每个数的二进制表示中恰有一位为 1)。
任意两个不同的 2 的幂进行按位与,结果均为 0(例如 1&2=0),生成了新标记 0。
在包含 0 之后,由于 0&x=0,不会再产生其他数字。最终集合由原来的 10 个幂和新增的 0 组成,不同标记总数为 11。
输入
1
4
7 5 3 1
输出
4
说明
初始有 7(01112)、5(01012)、3(00112)和 1(00012)。
这四个数字的最低二进制位都是 1,因此任意子集的按位与结果最低位也必定是 1,不可能得到 0。
实际计算两两按位与:7&5=5,7&3=3,7&1=1,5&3=1 等等,得到的全部是已有的数字,没有生成任何新标记。所以最终集合的大小仍为 4。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册