Xor Sum 4
問題
D – Xor Sum 4
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2021/1/28 解法わからず。
解法
- \(XOR\) は桁ごとに独立して考えることができるので、桁ごとの総和を計算する。
- \(XOR\) をとって、\(1\) になる組み合わせは、\(0\) の数 \(\times\) \(1\) の数 \(= X\) 通りある。
- \(i\) 桁目の総和は、\(X \times 2^{i}\) となる。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; int main() { int N; cin >> N; vector<ll> A(N); rep(i, N) { cin >> A[i]; } mint ans = 0; rep(i, 60) { int cntZero = 0; int cntOne = 0; // i 桁目の 0 と 1 の数を数える rep(j, N) { if(A[j] >> i & 1) { cntOne++; } else { cntZero++; } } // i 桁目が 1 になるのは、 // cntOne * cntZero 通りある。 // 総和は これに 2^i をかける。 mint v = (mint)cntOne * (mint)cntZero; rep(j, i) { v = v * 2; } ans += v; } cout << ans.val() << endl; return 0; }