题目描述
现有一个有nn个元素的序列a=[a1,a2,⋯,an],定义这个序列的价值为∑i=1,n,i×ai。空序列的价值为0。
先给你一个长度为n的序列a,求a中所有子集价值的异或和,要求子集中元素的相对位置保持不变。
异或和: 位运算的一种。如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。
输入输出格式
输入
第一行一个整数nn
接下来一行有n个非负整数表示a1,a2,⋯,an。
输出
一个整数表示所有子集的异或和
样例1
输入
2
1 2
输出
6
数据规模
1≤n≤20,1≤a≤10^5
提示
样例1中共有四个子集[],[1],[2],[1,2],他们的价值分别为0,1,2,5,其异或和0⨁1⨁2⨁5=6
代码实现:
#include <iostream>
using namespace std;
template<class T>
int ziji(T a[], T b[], int n){
b[0]++;
if(b[n-1] == 2){//判断是否已经全部情况执行一遍
return 0;
}
for(int i = 0; i < n-1; i++){//模拟二进制加法
if(b[i] == 2){
b[i+1]++;
b[i] = 0;
}
}
int x = 0;
for(int i = n-1,t = 1; i >= 0; i--){//求出子集的价值
if(b[i] == 1){
x = x + a[n-i-1] * t;
t++;
}
}
return x^ziji(a, b, n);
}
int main(){
int n;
cin >> n;
int a[n], b[n];
for(int i = 0; i < n; i++){
cin >> a[i];
b[i] = 0;
}
int d = ziji(a, b, n);
cout << d << endl;
return 0;
}