#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> a(n);
vector<int> b(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
// 1) Prefix sums of squares
vector<ll> pre(n + 1);
pre[0] = 0;
for (int i = 0; i < n; i++) pre[i + 1] = pre[i] + a[i] * a[i];
// 2) Build sparse table for OR
int LOG = __lg(n) + 1;
vector<vector<int>> sp(n, vector<int>(LOG));
for (int i = 0; i < n; i++) sp[i][0] = b[i];
for (int j = 1; j < LOG; j++) {
for (int i = 0; i + (1 << j) <= n; i++) {
sp[i][j] = sp[i][j - 1] | sp[i + (1 << (j - 1))][j - 1];
}
}
auto getOR = [&](int l, int r) {
int j = __lg(r - l + 1);
return sp[l][j] | sp[r - (1 << j) + 1][j];
};
// 3) Precompute next positions of each bit
const int B = 21;
vector<array<int, B>> nxt(n);
array<int, B> last;
last.fill(n);
for (int i = n - 1; i >= 0; --i) {
for (int k = 0; k < B; ++k) nxt[i][k] = last[k];
for (int k = 0; k < B; ++k) if ((b[i] >> k) & 1) last[k] = i;
}
// 4) Precompute, for each i, the sorted breakpoints where OR changes
vector<vector<int>> changes(n);
for (int i = 0; i < n; ++i) {
int baseOR = b[i];
auto &pts = changes[i];
pts.reserve(B);
for (int k = 0; k < B; ++k) {
if (!((baseOR >> k) & 1) && nxt[i][k] < n) {
pts.push_back(nxt[i][k]);
}
}
sort(pts.begin(), pts.end());
pts.erase(unique(pts.begin(), pts.end()), pts.end());
}
// 5) Count good pairs using precomputed breakpoints
ll answer = 0;
for (int i = 0; i < n; ++i) {
int prev = i;
auto &pts = changes[i];
int m = pts.size();
for (int idx = 0; idx <= m; ++idx) {
int end = (idx < m ? pts[idx] - 1 : n - 1);
ll ORval = getOR(i, prev);
ll G = ORval * ORval;
int lo = prev, hi = end, best = prev - 1;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
ll F = pre[mid + 1] - pre[i];
if (F < G) {
best = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
if (best >= prev) answer += best - prev + 1;
if (idx < m) prev = pts[idx];
}
}
cout << answer << '\n';
return 0;
}