题目描述
光头强在森林里伐木时,发现了一张神秘的数学卷轴。卷轴上记录了一个由 n 个正整数组成的序列 a1,a2,...,an 。
为了换取森林里那一块长势喜人的木材,光头强必须破解卷轴上的谜题。谜题要求他计算出有多少个二元对 (i,j) ,满足 1≤i≤j≤n ,且同时成立以下两个关于位运算的条件。
定义两个函数:
- fmax(x) 表示 x 的二进制表示中最高位的 1 所代表的值(即不大于 x 的最大 2 的整数次幂)。例如 fmax(10)=8 ( 10 的二进制为 (1010)2 ,最高位 1 在第三位,权重为 23=8 )。
- fmin(x) 表示 x 的二进制表示中最低位的 1 所代表的值(即
lowbit(x))。例如 fmin(10)=2 ( 10 的二进制为 (1010)2 ,最低位 1 在第一位,权重为 21=2 )。
要求满足的条件为:
- $f_{max}(a_{i} \oplus a_{j})=max(f_{max}(a_{i}),f_{max}(a_{j}))$
- $f_{min}(a_{i} \oplus a_{j})=min(f_{min}(a_{i}),f_{min}(a_{j}))$
其中 ⊕ 表示按位异或运算。
如果光头强不能在规定时间内算出结果,熊大和熊二就会来阻止他伐木。请你帮帮他!
输入格式
输入包含多组测试数据。
第一行包含一个正整数 T ,表示测试数据组数。
接下来包含 T 组测试数据,每组测试数据的格式如下:
第一行包含一个正整数 n ,表示序列的长度。
第二行包含 n 个正整数 a1,a2,...,an ,表示序列中的元素。
输出格式
对于每组测试数据,输出一个整数,表示满足条件的二元对 (i,j) 的个数。
输入输出样例 #1
输入 #1
2
5
3 5 6 10 12
3
1 2 4
输出 #1
6
3
说明/提示
第一组数据:序列为 [3,5,6,10,12] 。满足条件的对为 (1,3),(1,4),(1,5),(2,4),(2,5),(3,5) ,共 6 对。
第二组数据:序列为 [1,2,4] 。满足条件的对为 (1,2),(1,3),(2,3) 共 3 对。
对于 100% 的数据, 1≤n≤2×105,1≤ai≤109
| 测试点编号 |
n≤ |
ai≤ |
特殊性质 |
| 1∼2 |
10 |
100 |
无 |
| 3∼5 |
500 |
109 |
| 6∼8 |
5000 |
| 9∼11 |
2×105 |
A |
| 12∼14 |
B |
| 15∼17 |
C |
| 18∼20 |
无 |
- 特殊性质A:保证所有 ai 均为 2 的整数次幂。
- 特殊性质B:保证所有 fmax(ai) 均相等。
- 特殊性质C:保证所有 fmin(ai) 均相等。