题目背景
somewhere   over   the rainbow   way up   high.
there's a land   that i heard of once   in a lullaby.
only blue. only blue.   愛讓人,好憂鬱。
我的心。我的心。藍藍的。
题目描述
给定长度为 n 的正整数序列 a1,a2,…,an。
求满足以下条件的正整数三元组 (i,j,k) 的个数:
- 1≤i<j<k≤n。
- popcount(ai⊕aj)≤2。
- popcount(ai⊕ak)≤2。
- popcount(ak⊕aj)≤2。
- ai⊕aj⊕ak=0。
你只需要输出答案模 109+7 的值。
其中 ⊕ 代表二进制下的按位异或运算。
::::info[popcount 是什么?]
对于正整数 x,我们定义 popcount(x) 为 x 在二进制下 1 的个数。
例如,11=(1011)2,因此 popcount(11)=3。
::::
输入格式
本题有多组测试数据。
每个输入数据第一行有一个整数 T。
每组测试第一行输入一个正整数 n。
每组测试第二行输入 n 个正整数,第 i 个正整数代表 ai。
输出格式
每组测试输出一行一个整数,代表答案模 109+7 的值。
2
3
1 1 1
5
1 2 3 4 5
0
2
提示
【样例解释】
- 第一组输入没有合法的三元组。
- 第二组输入有 (i,j,k)=(1,2,3),(1,4,5) 两组合法。
【数据范围与约定】
对于 100% 的数据,保证:
- 1≤n≤3×105,
- 1≤ai≤2120,
- 1≤T≤10。
::cute-table{tuack}
| Subtask | n≤ | ai≤ | 特殊性质 | 分数 | 
| 1 | 10 | 230 | 无 | 10 | 
| 2 | 2000 | 15 | 
| 3 | 104 | 
| 4 | 105 | 260 | A | 5 | 
| 5 | B | 
| 6 | 无 | 20 | 
| 7 | 3×105 | 2120 | 30 | 
特殊性质 A:对于任意 ai,满足 popcount(ai)=1。
特殊性质 B:满足 ai≥230 且数据随机。
【其它注意事项】
本题输入量较大,请使用较快的 IO 方式。
本题 ai 的范围较大,您可以使用 __int128。
__int128 可以存储大致 2127 左右的数据,你可以用它存储 ai。但是,它并不支持传统的输入输出,因此我们提供了读入模板,你可以调用该函数读入 __int128。
void redi (__int128& ret) {
    ret = 0; int f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -f; ch = getchar();}
    while (ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0', ch = getchar();
    ret *= f;
} // 调用 redi(x) 以读入变量 x。