#include<bits/stdc++.h>
#define rep(i, x) for (ll i = 0; i < (x); i++)
#define chmax(x, a) do { x = max(x, a); } while(0)
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
ull N, A, B, X, S;
const ll M = 50;
ll dp[M][2][2];
int main(void) {
cin >> N >> A >> B;
rep(i, N-2) {
ull x;
cin >> x;
X ^= x;
}
S = A + B;
// 初期化
rep(i, M) rep(j, 2) rep(k, 2) dp[i][j][k] = -1;
rep(a, 2) {
ull b = a ^ (X & 1);
ull carry = a & b;
ull _sum = a ^ b;
if (_sum != (S & 1)) continue;
ull over = a > (A & 1);
chmax(dp[0][carry][over], a);
}
// 配るDP
rep(i, M-1) rep(j, 2) rep(k, 2) rep(a, 2) {
if (dp[i][j][k] == -1) continue;
ull ni = i + 1;
ull b = a ^ ((X >> ni) & 1);
ull _sum = (a + b + j) & 1;
ull _carry = ((a + b + j) & 2) > 0;
if (_sum != ((S >> ni) & 1)) continue;
ull over;
if (a > ((A >> ni) & 1)) over = 1;
if (a < ((A >> ni) & 1)) over = 0;
if (a == ((A >> ni) & 1)) over = k;
chmax(dp[i+1][_carry][over], dp[i][j][k] | (a << ni));
}
ll a = dp[M-1][0][0];
if (a == -1 || a == 0) {
cout << -1 << endl;
return 0;
}
cout << (A-a) << endl;
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘ull’ {aka ‘long long unsigned int’} [-Wsign-compare]
2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
| ^
./Main.cpp:16:3: note: in expansion of macro ‘rep’
16 | rep(i, N-2) {
| ^~~
./Main.cpp:30:18: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘ull’ {aka ‘long long unsigned int’} [-Wsign-compare]
30 | ull over = a > (A & 1);
| ~~^~~~~~~~~
./Main.cpp:43:11: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘ull’ {aka ‘long long unsigned int’} [-Wsign-compare]
43 | if (a > ((A >> ni) & 1)) over = 1;
| ~~^~~~~~~~~~~~~~~~~~
./Main.cpp:44:11: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘ull’ {aka ‘long long unsigned int’} [-Wsign-compare]
44 | if (a < ((A >> ni) & 1)) over = 0;
| ~~^~~~~~~~~~~~~~~~~~
./Main.cpp:45:11: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘ull’ {aka ‘long long unsigned int’} [-Wsign-compare]
45 | if (a == ((A >> ni) & 1)) over = k;
| ~~^~~~~~~~~~~~~~~~~~