TechFUL: Xor Rush
ABC147 の Xor Sum 4 と実質同じ問題.
問題概要
長さ の整数列 と長さ の整数列 が与えられる.
を求めよ.
制約
解法
XOR 系の問題なので を2進数表示して、各桁ごとに考えてみる.
まず、 を2進数表示すると何桁になるか調べる.
これは、制約から より
となり、高々20桁と分かる.
次に、式 (1) を2進数表示を意識して式変形する.
ただし、 を ビット目が である の要素の個数とする.
同様に も定義する.
以上より、 を計算すれば、式 (2) を基に答えを得る.
#include <bits/stdc++.h> using namespace std; int main() { int N, M; cin >> N >> M; vector<int> A(N), B(M); for (int i = 0; i < N; ++i) cin >> A[i]; for (int i = 0; i < M; ++i) cin >> B[i]; long long cntA[20][2] = {}, cntB[20][2] = {}; for (int d = 0; d < 20; ++d) { for (int i = 0; i < N; ++i) { cntA[d][A[i] >> d & 1]++; } for (int i = 0; i < M; ++i) { cntB[d][B[i] >> d & 1]++; } } long long ans = 0; for (int d = 0; d < 20; ++d) { ans += (1LL << d) * (cntA[d][0] * cntB[d][1] + cntA[d][1] * cntB[d][0]); } cout << ans << endl; }