Vj数据实验1(一)

题目描述

现有一个有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;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值