-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGCD and XOR
50 lines (39 loc) Β· 1.19 KB
/
GCD and XOR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long gcd(long long a, long long b) {
while (b != 0) {
long long temp = b;
b = a % b;
a = temp;
}
return a;
}
int calculateOperations(const vector<long long>& arr, long long k) {
if (all_of(arr.begin(), arr.end(), [k](long long x) { return x == k; })) {
return 0;
}
auto start = find_if(arr.begin(), arr.end(), [k](long long x) { return x != k; });
auto end = find_if(arr.rbegin(), arr.rend(), [k](long long x) { return x != k; }).base() - 1;
if (start == end) {
return 1;
}
bool allMultiples = all_of(start, end + 1, [k](long long x) { return x % k == 0; });
long long firstXOR = (*start) ^ k;
bool sameXOR = all_of(start, end + 1, [k, firstXOR](long long x) { return (x ^ k) == firstXOR; });
return (allMultiples || sameXOR) ? 1 : 2;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
long long k;
cin >> n >> k;
vector<long long> arr(n);
for_each(arr.begin(), arr.end(), [](long long& x) { cin >> x; });
cout << calculateOperations(arr, k) << endl;
}
return 0;
}