D. 除还是或
每次测试的时间限制:3 秒
每次测试的内存限制:512 兆字节
给你一个由 0 到 109 之间的整数组成的数组 [a1,a2,…,an]。
你需要把这个数组分成若干个连续的段(可能只有一段),使得每个元素恰好属于一个段。
设第一段为 [al1,al1+1,…,ar1],
第二段为 [al2,al2+1,…,ar2],
……,
最后一段为 [alk,alk+1,…,ark]。
由于每个元素应恰好属于一个数组,所以 l1=1,rk=n,并且对每个 i 从 1 到 k−1 有 ri+1=li+1。
分割必须满足以下条件:
$$f([a_{l_1}, a_{l_1+1}, \dots, a_{r_1}]) \le f([a_{l_2}, a_{l_2+1}, \dots, a_{r_2}]) \le \cdots \le f([a_{l_k}, a_{l_k+1}, \dots, a_{r_k}])
$$
其中 f(a) 是数组 a 中所有元素的按位或。
计算分割数组的方式的数量,结果对 998244353 取模。
如果表示分割的序列 [l1,r1,l2,r2,…,lk,rk] 不同,则视为不同的方式。
输入
第一行包含一个整数 n(1≤n≤2⋅105)—— 数组 a 的长度。
第二行包含 n 个整数 a1,a2,…,an(0≤ai≤109)—— 给定数组的元素。
输出
输出一个整数 —— 分割数组的方式的数量,对 998244353 取模。
样例
样例 1
输入
3
1 2 3
输出
4
样例 2
输入
5
1000 1000 1000 1000 1000
输出
16
样例 3
输入
3
3 4 6
输出
3
注释
在第三个样例中,有 3 种有效的分割方式:
- k=3:l1=1,r1=1,l2=2,r2=2,l3=3,r3=3;得到的数组为 [3]、[4]、[6],且 3≤4≤6;
- k=2:l1=1,r1=1,l2=2,r2=3;得到的数组为 [3] 和 [4,6],且 3≤6;
- k=1:l1=1,r1=3;只有一个数组 [3,4,6]。
如果将数组分成 [3,4] 和 [6],第一个数组的按位或是 7,第二个数组的按位或是 6;7>6,因此这种分割方式无效。