CF1625D Binary Spiders

题目描述

二进制蜘蛛是一种生活在火星上的蜘蛛。这些蜘蛛会织网来保护自己免受敌人的侵害。 在织网时,蜘蛛会两两结对。如果一对中第一个蜘蛛有 $x$ 条腿,第二个蜘蛛有 $y$ 条腿,那么它们可以织出耐久度为 $x \oplus y$ 的蛛网。这里的 $\oplus$ 表示按位异或运算。 二进制蜘蛛通常群居生活。你观察到一个有 $n$ 只蜘蛛的群体,第 $i$ 只蜘蛛有 $a_i$ 条腿。 当群体受到威胁时,会有一些蜘蛛成为防御者。选择防御者的方式如下:首先,防御者的数量至少为两只;其次,任意一对防御者都能织出耐久度不少于 $k$ 的蛛网;最后,防御者的数量要尽可能多。 科学家们长期研究二进制蜘蛛的行为,现在他们有一个假设:总能以最优方式选择防御者,使上述条件都满足。你需要验证这个假设是否成立。因此,你需要计算出最多有多少只蜘蛛可以成为防御者。你不是二进制蜘蛛,所以你决定用计算机来解决这个问题。

输入格式

第一行包含两个整数 $n$ 和 $k$($2 \le n \le 3 \cdot 10^5$,$0 \le k \le 2^{30} - 1$),分别表示蜘蛛的数量和蛛网的最小允许耐久度。 第二行包含 $n$ 个整数 $a_i$($0 \le a_i \le 2^{30} - 1$),表示第 $i$ 只蜘蛛的腿数。

输出格式

第一行输出一个整数 $\ell$($2 \le \ell \le n$),表示最多可以选择的防御者数量。 第二行输出 $\ell$ 个用空格分隔的整数 $b_i$($1 \le b_i \le n$),表示成为防御者的蜘蛛的编号。 如果存在多种选择防御者的方式,可以输出任意一种。 如果无法选择出符合条件的防御者,输出一个整数 $-1$。

说明/提示

请参考上面的示例。 在第一个示例中,蜘蛛群体如下图所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1625D/1010007e17d60a2fb95617e44d5646f679fa1136.png) 我们选择腿数为 $2$、$10$ 和 $16$ 的蜘蛛。可以发现,每一对蜘蛛都能织出足够耐久度的蛛网,因为 $2 \oplus 10 = 8 \ge 8$,$2 \oplus 16 = 18 \ge 8$,$10 \oplus 16 = 26 \ge 8$。 这不是唯一的选择方式,例如也可以选择编号为 $3$、$4$ 和 $6$ 的蜘蛛。 在第二个示例中,没有任意一对蜘蛛能织出耐久度不少于 $1024$ 的蛛网,因此答案为 $-1$。 由 ChatGPT 4.1 翻译