P12555 [UOI 2024] AND Array
题目描述
给定一个整数 $b$ 和一个非负整数数组 $a_1,a_2,\ldots,a_n$。数组 $a$ 的所有元素都小于 $2^b$。
定义 $f(s, p)$ ($1\le s\le n$, $0\le p < b$) 为以下伪代码的执行结果:
```
res = 0
x = power(2, p)
for i = s to n:
if ((x AND a[i]) == 0):
x = (x OR a[i])
res = res + i
return res
```
其中,``power(2, p)`` 表示 $2^p$,``AND`` 表示按位与运算,``OR`` 表示按位或运算。
非负整数 $a$ 和 $b$ 的按位与运算结果是一个非负整数,其二进制表示中某一位为 1 当且仅当 $a$ 和 $b$ 的二进制表示在该位都为 1。例如,$3_{10}$ AND $5_{10} = 0011_{2}$ AND $0101_{2} = 0001_{2} = 1_{10}$。
非负整数 $a$ 和 $b$ 的按位或运算结果是一个非负整数,其二进制表示中某一位为 0 当且仅当 $a$ 和 $b$ 的二进制表示在该位都为 0。例如,$3_{10}$ OR $5_{10} = 0011_{2}$ OR $0101_{2} = 0111_{2} = 7_{10}$。
对于每个 $i$ 从 $1$ 到 $n$,计算
$$f(i,0) + f(i, 1) + \ldots + f(i, b-1)$$
输入格式
第一行包含两个整数 $n$ 和 $b$ ($1 \leq n \leq 10^5$, $1 \leq b \leq 20$) —— 分别表示数组 $a$ 的长度和数组元素的限制。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$ ($0 \leq a_i < 2^b$) —— 数组 $a$ 的元素。
输出格式
输出 $n$ 个整数 —— 要求的计算结果。
说明/提示
在第一个示例中,$f(1,0)=1+2+5=8$,$f(1,1)=1+3+5=9$,$f(1,2)=1+2+3=6$,因此第一个要求的值为 $8+9+6 = 23$。
### 评分标准
- (10 分):$n \leq 2\,000$;
- (10 分):$a_i = 2^k$,其中 $k$ 为整数;
- (15 分):$b \leq 8$;
- (15 分):$b \leq 12$;
- (25 分):$b \leq 16$;
- (25 分):无额外限制。
翻译由 DeepSeek V3 完成