Tea Break 005
コンテスト日時
2020/12/20 (Su) 21:00 - 21:20

F - OR or XOR

Earlgray
2
s
1024
MB
500

問題文

長さ $N$ の数列 $A_1,A_2,...,A_N$ があります。この数列に対し、次の操作を行います。

  1. まず、変数 $x$ を持ちます。これは最初 $0$ です。また、変数 $i$ を持ちます。これは最初 $1$ です。
  2. $x$ を、「 $x$ と $A_i$ のbitごとの論理和」もしくは「 $x$ と $A_i$ のbitごとの排他的論理和」で置き換えます。
  3. もし、 $i=N$ なら操作を終了します。そうでなければ $i$ に $1$ を足し、操作2に戻ります。

ここで、 $N$ 回の操作 2 でそれぞれ $x$ をどちらで置き換えるかによって、異なる操作を $2^N$ 通り考えることができます。この全てに対する最終的な $x$ の総和を $10^9+7$ で割った余りを出力してください。

制約

・入力は全て整数
・$1\leq N\leq 2×10^5$
・$0\leq A_i\leq 10^{18}\ (1\leq i\leq N)$

入力

入力は以下の形式で与えられます。

$N$
$A_1\ A_2\ ...\ A_N$

出力

全ての異なる操作の方法に対する、最終的な $x$ の値の総和を $10^9+7$ で割った余りを 1 行に出力してください。

入力例 1
3 1 2 3
出力例 1
12

$x$ は、 $4$ 通りの操作において $(1,3,0)$ と変化し、 $4$ 通りの操作において $(1,3,3)$ と変化します。そのため、このケースでの答えは
$0×4+3×4=12$ となります。どちらの操作を行っても $x$ が同じ数で置き換えられる場合でも、2つの操作を区別することに気をつけてください。

入力例 2
2 998244353 31415926535
出力例 2
995738273

$10^9+7$ で割った余りを出力してください。

提出
C++23 (g++ 12.2.0)