Challenge: XOR love
Subdomeniu: Algebra (algebra)
Scor cont: 50.0 / 50
Submission status: Accepted
Submission score: 1.0
Submission ID: 464755021
Limbaj: cpp14
Link challenge: https://www.hackerrank.com/challenges/xor-love/problem
Cerinta
Devendra loves the XOR operation very much which is denoted by $\wedge$ sign in most of the programming languages. He has a list $A$ of $N$ numbers and he wants to know the answers of $M$ queries. Each query will be denoted by three numbers i.e. $K,P,R$ .
For query $K,P \text{ and } R$, he has to print the value of the $KPRsum$ which can be described as given below. As the value of the $KPRsum$ can be large. So, print it modulus $(10^9 + 7)$.
$$ KPRsum = \sum_{i=P}^{R-1} \sum_{j=i+1}^{R} (K \oplus (A[i] \oplus A[j]) )$$
**Input Format**
The first line contains an integer $N$, i.e., the number of the elements in the list. List is numbered from $1$ to $N$.
Next line will contain $N$ space seperated integers.
Third line will contain a number $M$ i.e. number of queries followed by $M$ lines each containing integers $K,P \& R$.
**Output Format**
Print $M$ lines, $i^{th}$ line will be answer of $i^{th}$ query. **Answer will be 0 in case of P=R.**
**Constraints**
$1 \le N \le 10^5$
$1 \le A[i] \le 10^6$
$1 \le M \le 10^5$
$0 \le K \le 10^6$
$1 \le P \le R \le N$
**Sample Input**
3
1 2 3
2
1 1 3
2 1 3
**Sample Output**
5
4
**Explanation**
For first query, it will will be $$(1 \oplus( 1 \oplus 2) ) + (1 \oplus( 1 \oplus 3) ) + (1 \oplus( 2 \oplus 3) ) = 5 $$
Cod sursa
#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 1000000007LL;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; ++i) cin >> a[i];
const int B = 31; // safe for values up to 1e9+
vector<vector<int>> pref(B, vector<int>(n + 1, 0));
for (int b = 0; b < B; ++b) {
for (int i = 1; i <= n; ++i) {
pref[b][i] = pref[b][i - 1] + ((a[i] >> b) & 1);
}
}
vector<long long> pow2(B, 1);
for (int b = 1; b < B; ++b) pow2[b] = (pow2[b - 1] * 2LL) % MOD;
int q;
cin >> q;
while (q--) {
int k, l, r;
cin >> k >> l >> r;
long long len = r - l + 1;
long long ans = 0;
for (int b = 0; b < B; ++b) {
long long ones = pref[b][r] - pref[b][l - 1];
long long zeros = len - ones;
long long pairs_one;
if (((k >> b) & 1) == 0) {
// Need A[i]^A[j] bit = 1 -> different bits.
pairs_one = ones * zeros;
} else {
// Need A[i]^A[j] bit = 0 -> same bits.
pairs_one = ones * (ones - 1) / 2 + zeros * (zeros - 1) / 2;
}
long long contrib = (pairs_one % MOD) * pow2[b] % MOD;
ans += contrib;
if (ans >= MOD) ans -= MOD;
}
cout << ans % MOD << '\n';
}
return 0;
}
HackerRank Algebra – XOR love
