题目描述
如你所见,这是一道十分不正经的题目,我们将十分不正经的考察你十分不正经的算法知识内容,题目如下:
给定 n 个非负整数 a1,a2,…,an 和一个整数 k (1≤k≤n)。需要找到三个最小的非负整数 x,y,z,使得以下三个条件成立:
- 对于按位与,集合 Sx={ai & x ∣ 1≤i≤n} 中不同元素的个数 ≤k;
- 对于按位或,集合 Sy={ai ∥ y ∣ 1≤i≤n} 中不同元素的个数 ≥k;
- 对于按位异或,集合 Sz={ai⊕z ∣ 1≤i≤n} 中不同元素的个数 =k
分别给出 x,y,z 的最小可行值,若无法满足则输出 −1。
按位运算:将两个数转为二进制数,对二进制表示中的每一位逐一运算。
按位与运算:0 & 0=0,0 & 0=1,1 & 0=0,1 & 1=1。
例:5 & 6=(101)2 & (110)2=(100)2=4。
按位或运算:0 ∥ 0=0,0 ∥ 1=1,1 ∥ 0=1,1 ∥ 1=1。
例:5 ∥ 6=(101)2 ∥ (110)2=(111)2=7。
按位异或运算:$0 \oplus 0 = 0,0 \oplus 1 = 1,1 \oplus 0 = 1,1 \oplus 1 = 0$。
例:5⊕6=(101)2⊕(110)2=(011)2=3。
输入格式
第一行包含两个整数 n,k (1≤k≤n≤2×105)。
第二行包含 n 个整数 ai (0≤ai<230)。
输出格式
如果有解,输出一行三个整数,分别代表 x,y,z 的最小可行值;如果无解,输出 −1。
3 5
1 2 3
0 -1 -1
3 1
1 1 1
0 0 0
说明
对于样例 1,按题意分别尝试可以发现:
对按位与操作,可行的最小值为 0;对按位或和按位异或操作,均无法找到满足条件的值,因此输出 −1。