atcoder の問題を解いているのですが、正解にたどり着けません。
自分で考えてもわからなかったので、私のコードのだめな点を指摘してもらえると助かります。
問題
N 個の整数があり、i 番目の整数は Ai です。
∑(i=1->N-1)∑(j=i+1->N)(Ai XOR Aj) を 10^9+7 で割った余りを求めてください。
整数 A,B のビットごとの排他的論理和 a XOR b は、以下のように定義されます。
- a XOR b を二進表記した際の 2^k (k≥0) の位の数は、A,B を二進表記した際の 2^k の位の数のうち一方のみが 1 であれば 1、そうでなければ 0 である。
例えば、3 XOR 5=6 となります (二進表記すると: 011 XOR 101=110)。
制約
- 2≤N≤3×10^5
- 0≤Ai<2^(60)
- 入力中のすべての値は整数である。
###自分のコード
c++
1#include<iostream> 2#include<algorithm> 3#include<cmath> 4typedef long long ll; 5using namespace std; 6 7int main(){ 8 int N; cin >> N; 9 ll A[N], ans = 0; 10 int one[60] = {}, count = 0, amari; 11 for(int i=0; i<N; i++) cin >> A[i]; 12 13 // A[i] = 2進数で2^i桁目が1になる数字の数 14 for(int i=0; i<60; i++){ 15 for(int j=0; j<N; j++){ 16 one[i] += A[j]%2; 17 A[j] = A[j]/2; 18 } 19 } 20 for(int i=0; i<60; i++){ 21 if(one[i] == 0) continue; 22 ans += one[i]*(N-one[i])*pow(2, i); 23 ans = ans%1000000007; 24 } 25 cout << ans << endl; 26} 27
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/09 15:11
2020/01/10 09:18 編集
退会済みユーザー
2020/01/10 10:25
2020/01/12 14:27
退会済みユーザー
2020/01/12 14:31