sum1[i][0] 表示前面的 a 數組中二進制第 i 位為0 的數目 sum1[i][1]sum1[i][1] 表示前面的 a 數組中二進制第 i 位為 1 的數目 sum2[i][0]sum2[i][0] 表示前面的 b 數組中二進制第 i 位為 0 的數目 sum2[i][1]sum2[i][1] 表示前面的b 數組中二進制第 i 位為 1 的數目
#include<bits/stdc++.h>usingnamespace std;constlonglong inf =1e18;constint N =1e6+5;constdouble eps =1e-10;constint mod =1e9+7;typedeflonglong ll;ll a[N], b[N];
ll ans[N];
ll sum1[64][2], sum2[64][2];
ll qpow(ll a, ll b){ll res =1;while(b){if(b &1){res = res * a % mod;}a = a * a % mod;b >>=1;}return res;}intmain(){int n;cin >> n;for(int i =1; i <= n; i++) cin >> a[i];for(int i =1; i <= n; i++) cin >> b[i];for(int i =1; i <= n; i++){ll p = ans[i -1]+(a[i]^ b[i])% mod;for(int j =0; j <=32; j++){if(a[i]&(1LL<< j)){// 該位為1p +=qpow(2, j)* sum2[j][0]% mod;}else{// 該位為0p +=qpow(2, j)* sum2[j][1]% mod;}//cout << j << ' ' << sum2[j][0] << ' ' << sum2[j][1] << "\n";}for(int j =0; j <=32; j++){if(b[i]&(1LL<< j)){// 該位為1p +=qpow(2, j)* sum1[j][0]% mod;}else{// 該位為0p +=qpow(2, j)* sum1[j][1]% mod;}}ans[i]= p % mod;for(int j =0; j <=32; j++){if(a[i]&(1LL<< j)){sum1[j][1]++;}else sum1[j][0]++;}for(int j =0; j <=32; j++){if(b[i]&(1LL<< j)){sum2[j][1]++;}else sum2[j][0]++;}}for(int i =1; i <= n; i++){cout << ans[i]% mod <<" \n"[i == n];}return0;}
方法二:
個人感覺和上一個方法處理思想其實差不多 也是分成二進制進行對應數位異或 式子: Ci=Ci-1+ai xor b1+ai xor b2+…ai xor bi +ai-1 xor bi +…a1 xor bi