CF2038D.Divide OR Conquer
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
给定一个由 [a1,a2,…,an] 组成的数组,其中每个元素都是 0 到 109 之间的整数。你需要将该数组划分为若干个连续的段(也可以只划分为一个段),使得每个元素恰好属于一个段。
设第一个段为 [al1,al1+1,…,ar1],第二个段为 [al2,al2+1,…,ar2],……,最后一个段为 [alk,alk+1,…,ark]。由于每个元素都应恰好属于一个段,所以 l1=1,rk=n,并且对于每个 i(1≤i≤k−1),都有 ri+1=li+1。划分还需满足以下条件:f([al1,al1+1,…,ar1])≤f([al2,al2+1,…,ar2])≤⋯≤f([alk,alk+1,…,ark]),其中 f(a) 表示数组 a 所有元素的按位或(bitwise OR)。
请计算有多少种不同的划分方式,并输出对 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
输出#1
4
输入#2
5 1000 1000 1000 1000 1000
输出#2
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,因此这种划分方式不合法。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?