给定一个长度为 N 的整数序列 A_1, A_2, \dots, A_N(每个元素为非负整数)。
定义任意一对下标 (i,j)(1 \le i < j \le N)的“按位异或值”为 A_i \oplus A_j(按位异或运算)。
请计算所有无序对的按位异或值之和: \sum_{1 \le i < j \le N} (A_i \oplus A_j)
并将结果对 10^9+7 取模后输出。
异或的含义:对两个整数按二进制逐位比较,相同位上不同则该位为 1,相同则为 0。例如 4 \oplus 1 = 5(在二进制下:100 \oplus 001 = 101)。
第一行为整数 N。
第二行给出 N 个非负整数,依次为 A_1, A_2, \dots, A_N,数值间用空格分隔。
输出一行,一个整数,表示所求和对 10^9+7 取模后的结果。
3 1 2 3
6
10 3 1 4 1 5 9 2 6 5 3
237
10 3 14 159 2653 58979 323846 2643383 27950288 419716939 9375105820
103715602
以样例 1 为例:
序列为 [1,2,3],两两计算:
总和为:3 + 2 + 1 = 6。
| 测试点编号 | N |
|---|---|
| 1 \sim 2 | 2 \le N \le 300 |
| 3 \sim 4 | 2 \le N \le 3 \times 10^4 |
| 5 \sim 10 | 2 \le N \le 3 \times 10^5 |
对于 100\% 的数据,满足 2 \le N \le 3 \times 10^5,0 \le A_i \le 2^{60}。