MOD = 10**9 + 7
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
# 预处理a和b的前缀和
prefix_a = [0] * (n + 1)
prefix_b = [0] * (n + 1)
for i in range(n):
prefix_a[i+1] = prefix_a[i] + a[i]
prefix_b[i+1] = prefix_b[i] + b[i]
total = 0
# 计算a中1的个数和0的个数
count_a1 = prefix_a[n]
count_a0 = n - count_a1
# 计算b中1的个数和0的个数
count_b1 = prefix_b[n]
count_b0 = n - count_b1
# 总贡献 = (a1 * b0 + a0 * b1) * 总子矩阵数
# 但需要更精确的计算
# 更精确的计算方式:每个c[i][j] = a[i] ^ b[j]的贡献是 (i+1)*(n-i)*(j+1)*(n-j)
# 所以总和 = sum_{i,j} (a[i]^b[j]) * (i+1)*(n-i)*(j+1)*(n-j)
# 计算a部分的贡献:sum_a1 = sum_{a[i]=1} (i+1)*(n-i)
sum_a1 = 0
sum_a0 = 0
for i in range(n):
term = (i + 1) * (n - i)
if a[i] == 1:
sum_a1 += term
else:
sum_a0 += term
# 计算b部分的贡献:sum_b0 = sum_{b[j]=0} (j+1)*(n-j), sum_b1类似
sum_b0 = 0
sum_b1 = 0
for j in range(n):
term = (j + 1) * (n - j)
if b[j] == 0:
sum_b0 += term
else:
sum_b1 += term
# 总贡献 = sum_a1 * sum_b0 + sum_a0 * sum_b1
result = (sum_a1 * sum_b0 + sum_a0 * sum_b1) % MOD
print(result)
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1e9 + 7;
int main() {
int n;
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
long long sum_a1 = 0, sum_a0 = 0;
for (int i = 0; i < n; ++i) {
long long term = 1LL * (i + 1) * (n - i);
if (a[i] == 1) sum_a1 = (sum_a1 + term) % MOD;
else sum_a0 = (sum_a0 + term) % MOD;
}
long long sum_b0 = 0, sum_b1 = 0;
for (int j = 0; j < n; ++j) {
long long term = 1LL * (j + 1) * (n - j);
if (b[j] == 0) sum_b0 = (sum_b0 + term) % MOD;
else sum_b1 = (sum_b1 + term) % MOD;
}
long long result = (sum_a1 * sum_b0 % MOD + sum_a0 * sum_b1 % MOD) % MOD;
cout << result << endl;
return 0;
}