密码安全

时间限制: 2000 ms 内存限制: 131072 kb
总通过人数: 0 总提交人数: 0

题目描述

有些人在社交网络中使用过许多的密码,我们通过将各种形式的信息转化为 01 信号,再转化为整数,可以将这个人在一段时间内使用过的密码视为一个长度为 $n$ 的非负整数序列 $A_1, A_2, \cdots, A_n$ 。

一个人相邻几次在社交网络中使用的密码很有可能是类似的,这使得密码并不是足够安全。为了检验某些人在某些时间段内是否可能受到不安全的影响,我们需要计算上述序列的复杂程度。

定义 $f(L, R) = \max(A_L, A_{L+1}, \cdots, A_R),$ $g(L, R) = A_L \otimes A_{L+1} \otimes \cdots \otimes A_R$ ,其中 $\otimes$ 表示按位异或,请你帮忙计算 $$\sum_{L = 1}^{n} \sum_{R = L}^{n} {f(L, R) g(L, R)}$$ 的值,这将作为我们评估密码复杂程度的一个部分。

由于答案可能很大,你只需要给出答案对 $10^9 + 61$ 取模的值即可。

提示:按位异或运算,指对等长二进制数的每一位执行逻辑异或操作。逻辑异或操作的结果是如果对应位不同则该位为 1 ,否则该位为 0 。例如

     0101
 XOR 0011
----------
   = 0110

可以发现,两个数字越相似,它们的异或值就可能越小。

输入

第一行包含一个正整数 $T$ ,表示有 $T$ 组测试数据。

接下来依次给出每组测试数据。对于每组测试数据:

第一行包含一个正整数 $n$ 。

第二行包含 $n$ 个非负整数,表示 $A_1, A_2, \cdots, A_n$ 。

保证在一行中的每个整数之间有恰好一个空格,没有其他额外的空格。

$1 \leq T \leq 200, 1 \leq n \leq 10^5, 1 \leq \sum{n} \leq 10^6, 0 \leq A_i \leq 10^9$

输出

对于每组数据输出一行,包含一个整数,表示答案对 $10^9 + 61$ 取模的值。

输入样例

3
1
61
5
1 2 3 4 5
5
10187 17517 24636 19706 18756

输出样例

3721
148
821283048

样例解释

对于第一组数据, $f(1, 1) = g(1, 1) = 61$ ,所以答案是 61 * 61 = 3721


Author: Tangjz

相关推荐