CF2038D.Divide OR Conquer

提高+/省选-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

给定一个由 [a1,a2,…,an][a_1, a_2, \ldots, a_n] 组成的数组,其中每个元素都是 00 到 10910^9 之间的整数。你需要将该数组划分为若干个连续的段(也可以只划分为一个段),使得每个元素恰好属于一个段。

设第一个段为 [al1,al1+1,…,ar1][a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}],第二个段为 [al2,al2+1,…,ar2][a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}],……,最后一个段为 [alk,alk+1,…,ark][a_{l_k}, a_{l_k+ 1}, \ldots, a_{r_k}]。由于每个元素都应恰好属于一个段,所以 l1=1l_1 = 1,rk=nr_k = n,并且对于每个 ii(1≤i≤k−11 \le i \le k-1),都有 ri+1=li+1r_i + 1 = l_{i+1}。划分还需满足以下条件:f([al1,al1+1,…,ar1])≤f([al2,al2+1,…,ar2])≤⋯≤f([alk,alk+1,…,ark])f([a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}]) \le f([a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}]) \le \dots \le f([a_{l_k}, a_{l_k+1}, \ldots, a_{r_k}]),其中 f(a)f(a) 表示数组 aa 所有元素的按位或(bitwise OR)。

请计算有多少种不同的划分方式,并输出对 998 244 353998\,244\,353 取模的结果。如果两个划分方式对应的 [l1,r1,l2,r2,…,lk,rk][l_1, r_1, l_2, r_2, \ldots, l_k, r_k] 序列不同,则认为它们是不同的划分方式。

输入格式

第一行包含一个整数 nn(1≤n≤2⋅1051 \le n \le 2 \cdot 10^5),表示数组 aa 的长度。

第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_n(0≤ai≤1090 \le a_i \le 10^9),表示给定数组的元素。

输出格式

输出一个整数,表示不同划分方式的数量,对 998 244 353998\,244\,353 取模。

输入输出样例

  • 输入#1

    3
    1 2 3

    输出#1

    4
  • 输入#2

    5
    1000 1000 1000 1000 1000

    输出#2

    16
  • 输入#3

    3
    3 4 6

    输出#3

    3

说明/提示

在前两个样例中,任何一种划分方式都是合法的。

在第三个样例中,有三种合法的划分方式:

  • k=3k = 3;l1=1,r1=1,l2=2,r2=2,l3=3,r3=3l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 2, l_3 = 3, r_3 = 3;得到的数组为 [3][3]、[4][4]、[6][6],且 3≤4≤63 \le 4 \le 6;
  • k=2k = 2;l1=1,r1=1,l2=2,r2=3l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 3;得到的数组为 [3][3] 和 [4,6][4, 6],且 3≤63 \le 6;
  • k=1k = 1;l1=1,r1=3l_1 = 1, r_1 = 3;只有一个数组 [3,4,6][3, 4, 6]。

如果将数组划分为 [3,4][3, 4] 和 [6][6],则第一个数组的按位或为 77,第二个数组的按位或为 66,7>67 > 6,因此这种划分方式不合法。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页