小红的异或之和【Python和C++实现】

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;
}
原文链接:,转发请注明来源!