- 给定n个数s[0],s[1],s[2],s[3]…s[n-1],求一个数w,使得w ^s [0]+w ^ s[1]+w ^ s[2]…w ^ s[n-1]的和最小。
- 思路:将n个数化为二进制数,统计n个数在每位二进制上1的个数,w的二进制取n个数每位二进制上个数多的(1或0),然后转化为十进制数w。
#include<bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define mod 1000000007
#define INF 0x3f3f3f
#define fi first
#define se second
#define it iterator
#define ins insert
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define np next_permutation
#define pq priority_queue
#define ll long long
#define ull unsigned long long
#define mem(a) memset(a,0,sizeof(a))
#define cio ios::sync_with_stdio(false)
#define gcd __gcd
ll lgcd(ll a,ll b){return b == 0? a:lgcd(b, a % b);}
int lowbit(int x){return x&(-x);}
#define T int t;scanf("%d",&t);while(t--)
#define Ce cout << endl
#define CE(n) cout << n << endl
#define C(n) cout << n;
#define CY cout << "YES" <<
#define CN cout << "NO" << endl
#define Cy cout << "Yes" << endl
#define Cn cout << "No" << endl
int s[10010];
int q[40];
void div(int x)
{
int k = 0;
while(x!=0){
int y = x%2;
q[k++] += y;
x /= 2;
}
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> s[i];
for(int i = 0; i < n; i++) div(s[i]);
int w = 0;
for(int i = 0; i < 32; i++){
if(n-q[i]<q[i]){
w += pow(2,i);
}
}
cout << w << endl;
int r = 0;
for(int i = 0; i < n; i++){
r += w^s[i];
}
cout << r << endl;
return 0;
}