传送门
- 题意:
- 题解:
2.1 二进制的题目应该首先思考二进制方法去做
2.2 列N*32表找规律
2.3 ok=false
表示从某一位开始已经确定的了这一位是什么数字,后面一次推到导就ok了,出现不可能的情况直接cout<<0;
。 - 代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
long long n, b[N], c[N];
long long ans;
int main() {
cin >> n;
for (int i = 2; i <= n; i++) cin >> b[i];
for (int i = 2; i <= n; i++) cin >> c[i], c[i] -= b[i];
ans = 1;
for (long long i = 0; i <= 31; i++) {
bool ok = true;
int pos = -1;
for (int j = 2; j <= n; j++) {
long long x = (1ll << i) & b[j];
long long y = (1ll << i) & c[j];
if (c[j] < 0) {
cout << 0;
return 0;
}
if (ok == false) {
if (pos == 0) {
if (x && y) {
cout << 0;
return 0;
}
if (x && !y) pos = 1;
} else {
if (!x && !y) {
cout << 0;
return 0;
}
if (x && !y) pos = 0;
}
}
if (!x && y) {
cout << 0;
return 0;
}
if (!x && !y) ok = false, pos = 0;
if (x && y) ok = false, pos = 1;
}
if (ok) ans *= 2;
}
cout << ans;
return 0;
}