「EZEC-6」分组

题目描述

给你 $n$ 个数,将它们分成任意组(可以不连续),将每个组内的数按位或,并将各组的结果累加,在保证其结果最小的情况下求最多分成的组数。

输入输出格式

输入格式


第一行输入一个正整数 $n$。 第二行输入 $n$ 个非负整数 $a_i$。

输出格式


一个正整数,最优解中最多分成的组数。

输入输出样例

输入样例 #1

6
1 1 4 5 1 4

输出样例 #1

1

输入样例 #2

7
1 9 1 9 8 1 0

输出样例 #2

2

输入样例 #3

8
1 9 2 6 0 8 1 7

输出样例 #3

2

输入样例 #4

9
3 1 4 1 5 9 2 6 5

输出样例 #4

1

输入样例 #5

9
9 9 8 2 4 4 3 5 3

输出样例 #5

1

输入样例 #6

6
1 2 3 4 8 12

输出样例 #6

2

说明

以下为各个样例的一种构造方案。 - $\{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<<21,stdin),p1==p2)?EOF:*p1++) char buf[1<<21],*p1=buf,*p2=buf; template <typename T> inline void read(T& r) { r=0;bool w=0; char ch=getchar(); while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar(); while(ch>='0'&&ch<='9') r=r*10+(ch^48), ch=getchar(); r=w?-r:r; } ```