#CF1616H. 保持异或较小

保持异或较小

保持异或较小

  • 时间限制:2 秒
  • 内存限制:512 MiB

题目描述

给定长度为 nn 的非负整数数组 a1,a2,…,ana_1,a_2,\ldots,a_n 和一个非负整数 xx。

请计算有多少个非空下标子集

1≤b1<b2<⋯<bk≤n1\le b_1<b_2<\cdots<b_k\le n

满足:对于任意 1≤i<j≤k1\le i<j\le k,均有

abixorabj≤x.a_{b_i}\mathbin{\mathtt{xor}}a_{b_j}\le x.

这里 xor\mathbin{\mathtt{xor}} 表示按位异或。由于答案可能很大,请输出答案对 998244353998244353 取模后的结果。

注意,选择的是下标;即使两个位置上的数值相等,它们仍是两个不同的可选元素。

输入格式

第一行包含两个整数 n,xn,x。

第二行包含 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n。

输出格式

输出一个整数,表示满足条件的非空下标子集数量对 998244353998244353 取模后的结果。

样例输入 1

4 2
0 1 2 3

样例输出 1

8

样例输入 2

3 6
4 2 2

样例输出 2

7

样例输入 3

4 0
1 1 2 2

样例输出 3

6

数据范围

对于所有数据:

  • 1≤n≤1500001\le n\le 150000;
  • 0≤x<2300\le x<2^{30};
  • 0≤ai<2300\le a_i<2^{30}。
子任务编号 分值 特殊限制
1 20 x=0x=0
2 40 n≤22n\le 22
3 无特殊限制