题意:
解法:
显然按二进制位计算贡献,
对于第k位, 考虑有多少个数对满足相加之后第k位为1 :
我们先将所有数对2 ^ ( k+ 1 ) 取模,
那么满足条件的数对, 加起来的和, 要么在[ 2 ^ k, 2 ^ ( k+ 1 ) - 1 ] 区间内,
要么在[ 2 ^ ( k+ 1 ) + 2 ^ k, 2 ^ ( k+ 1 ) + 2 ^ k+ ( 2 ^ k- 1 ) ] 区间内,
排序之后双指针求数量即可,
由于是异或, 我们只需要知道数量的奇偶性就行了.
复杂度O ( n* log* log) .
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxm= 1e6 + 5 ;
int a[ maxm] ;
int b[ maxm] ;
int p2[ 33 ] ;
int ans;
int n;
int cal2 ( int l, int r) {
int ans= 0 ;
int pl= n, pr= n;
for ( int i= 1 ; i<= n; i++ ) {
while ( pl>= i&& b[ i] + b[ pl] >= l) pl-- ;
while ( pr>= i&& b[ i] + b[ pr] > r) pr-- ;
if ( pl<= i&& pr<= i) break ;
ans+ = max ( i, pr) - max ( i, pl) ;
}
return ans% 2 ;
}
int cal ( int k) {
for ( int i= 1 ; i<= n; i++ ) b[ i] = ( a[ i] & ( p2[ k+ 1 ] - 1 ) ) ;
sort ( b+ 1 , b+ 1 + n) ;
int f1= cal2 ( p2[ k] , p2[ k+ 1 ] - 1 ) ;
int f2= cal2 ( p2[ k+ 1 ] + p2[ k] , p2[ k+ 1 ] + p2[ k] + p2[ k] - 1 ) ;
return f1^ f2;
}
inline void solve ( ) {
p2[ 0 ] = 1 ; for ( int i= 1 ; i<= 32 ; i++ ) p2[ i] = p2[ i- 1 ] * 2 ;
cin>> n;
for ( int i= 1 ; i<= n; i++ ) cin>> a[ i] ;
int ans= 0 ;
for ( int i= 0 ; i<= 30 ; i++ ) ans| = ( 1 << i) * cal ( i) ;
cout<< ans<< endl;
}
signed main ( ) {
ios:: sync_with_stdio ( 0 ) ; cin. tie ( 0 ) ;
solve ( ) ;
return 0 ;
}