E. MyGO!!!!!
time limit per test
3 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output

小 A 最近喜欢上了一部番《BanG Dream! It's MyGO!!!!!》。

MyGO

现在他有一个长度为 $$$n$$$ 的数列 $$$\{a_n\}$$$ ,现在要把它分成若干段,要求每段的异或和均严格大于 $$$k$$$。

划分出的每段必须连续,并且每个元素恰好在其中的一个段中。

小 A 想知道,对于所有的划分方案,划分段数三次方的总和是多少,由于这个数可能很大,你只需要输出它对 $$$998244353$$$ 取模后的结果即可。

形式化的,对于所有数列 $$$\{a_n\}$$$ 的划分 $$$\{x_0,x_1,x_2\dots x_m\}$$$,满足 $$$x_0=0$$$, $$$x_m=n$$$ 和 $$$x_{i-1} \lt x_i$$$,求: $$$$$$ \sum_{x_0,x_1,x_2\dots x_m}^{}m^3[\bigwedge_{i=0}^{m-1}[\bigoplus_{j=x_i+1}^{x_{i+1}}a_j \gt k]] \quad \mathrm{mod} \quad 998244353 $$$$$$

其中,部分符号解释如下:

  • $$$[x]$$$:若 $$$x$$$ 是一个条件表达式,若 $$$x$$$ 成立,则 $$$[x]$$$ 的值为 $$$1$$$ ,否则 $$$x$$$ 的值为 $$$0$$$ 。
  • $$$\bigwedge$$$ :表示其后所有条件逻辑与的结果,即该条件成立当且仅当其后所有条件成立。
  • $$$\bigoplus$$$ :表示其后所有数值按位异或的结果。
  • 异或:对于两个二进制数的按位异或运算,只有当他们同一位的数值相同时才为1,否则取0。在C/C++中对应的运算符号是 ^ 。例如:$$$(1010)_2\ \rm{xor}\ (1100)_2=(0110)_2$$$ 。
Input

输入共包含两行。

第一行包含两个整数 $$$n,k$$$ ($$$1\leq n \leq {10^6},1\leq k \leq {10^9}$$$) 。

第二行包含 $$$n$$$ 个整数 $$$a_1,a_2,\cdots,a_n$$$ ($$$0\leq a_i \leq 10^6$$$)。

Output

输出一个数 $$$n$$$ ,表示所有方案中划分段数三次方的和对 $$$998244353$$$ 取模后的结果。

Examples
Input
3 2
1 2 3
Output
8
Input
4 4
1 4 7 9
Output
36