P7384 「EZEC-6」分组
题目描述
给你 $n$ 个数,将它们分成任意组(可以不连续),将每个组内的数按位或,并将各组的结果累加,在保证其结果最小的情况下求最多分成的组数。
输入格式
无
输出格式
无
说明/提示
以下为各个样例的一种构造方案。
- $\{1,1,4,5,1,4\}$
- $\{1,9,1,9,8,1\},\{0\}$
- $\{1,9,2,6,8,1,7\},\{0\}$
- $\{3,1,4,1,5,9,2,6,5\}$
- $\{9,9,8,2,4,4,3,5,3\}$
- $\{1,2,3\},\{4,8,12\}$
对于样例 $6$ ,$\{1,2,3,4,8,12\}$ 也是一种最小化答案的方案,但是 $\{1,2,3\},\{4,8,12\}$ 分出的组数更多。
本题采用捆绑测试计分。
* Subtask $1$ :$n\leq8$,$20$ 分。
* Subtask $2$ :$n\leq10^3$,$20$ 分。
* Subtask $3$ :$a_i\in\{0,1\}$,$5$ 分。
* Subtask $4$ :$n=10^6$,且保证数据随机,$5$ 分。
* Subtask $5$ :$n\leq10^6$,$30$ 分。
* Subtask $6$ :$n\leq10^7$,$20$ 分。
对于所有数据,$0\leq a_i\leq10^{18}$,$1\leq n\leq10^7$。
如果你不知道什么是按位或,请[点击这里](https://baike.baidu.com/item/%E6%8C%89%E4%BD%8D%E6%88%96)。
本题自动开启O2优化。
本题提供读入优化方式。
使用 `read(x);` 读入一个任意的整型 `x` 等价于 `scanf("%d", &x);`其中可以将 `%d` 自动识别为对应类型。
```cpp
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1