CF243A The Brand New Function
题目描述
Polycarpus 有一个长度为 $n$ 的非负整数序列:$a_{1},a_{2},...,a_{n}$。
我们定义函数 $f(l,r)$($l,r$ 是整数,$1 \leq l \leq r \leq n$)为序列 $a$ 的下标从 $l$ 到 $r$ 的所有元素的按位或操作。形式化地表示为:$f(l,r) = a_{l} \mid a_{l+1} \mid \ldots \mid a_{r}$。
Polycarpus 在纸上写下了所有满足 $1 \leq l \leq r \leq n$ 的 $f(l,r)$ 的值。现在他想知道,最后他得到了多少个不同的 $f(l,r)$ 的值。
请你帮 Polycarpus 计算,对于给定序列 $a$,函数 $f(l,r)$ 总共能取到多少个不同的值。
表达式 $x \mid y$ 表示对 $x$ 和 $y$ 进行按位或运算。这种运算在所有现代编程语言中都存在,例如在 C++ 和 Java 中使用 "|",在 Pascal 中使用 "or"。
输入格式
第一行包含一个整数 $n$ $(1 \leq n \leq 10^{5})$,表示序列 $a$ 的元素个数。
第二行包含 $n$ 个用空格分隔的整数 $a_{1}, a_{2}, ..., a_{n}$ $(0 \leq a_{i} \leq 10^{6})$,表示序列 $a$ 的各个元素。
输出格式
输出一个整数,表示对于给定序列 $a$,函数 $f(l,r)$ 的不同取值的数量。
请不要在 C++ 中用 %lld 读写 64 位整数。推荐使用 cin, cout 流或 %I64d 格式符。
说明/提示
在第一个测试样例中,Polycarpus 共在纸上写下了 $6$ 个数:$f(1,1)=1$,$f(1,2)=3$,$f(1,3)=3$,$f(2,2)=2$,$f(2,3)=2$,$f(3,3)=0$。这些数中恰好有 $4$ 个不同的值:$0, 1, 2, 3$。
由 ChatGPT 5 翻译