洛谷-P2415 集合求和

1.题目介绍

2.题解

这里我们可以针对单个元素可能出现的子集个数进行统计, 而不是以集合为单位
比如像我们讨论{2,3,4,5}中 2的所有可能出现次数
可以分为:

  1. 2在子集中单独出现
  2. 2在子集中和另一个元素一起出现
  3. 2在子集中和另两个元素一起出现
  4. 2在子集中和剩下所有元素一起出现
    我们发现一共就只有这几种情况,2不可能有其他的出现情况,那么元素2能构成的自己元素和就是
    2(值) * 2(41), 而其他的元素同理(出现次数是相同的),最终就可以获得所有子集元素和 = (元素和)* 出现次数

至于为何C30+C31+C32+C33=23
可以使用数学归纳法:
1.对于C00=20
2.假设对于n = k,Ck0+Ck1+Ck2+...+Ckk=2k成立
3.对于n = k + 1,
Ck+10+Ck+11+Ck+12++Ck+1k+Ck+1k+1=Ck+10+(Ck0+Ck1)+(Ck1+Ck2)++(Ckk1+Ckk)+Ck+1k+1=Ck+10+22kCk0Ckk+Ck+1k+1=2k+1

此时n = k + 1, 所以推理成立!

代码

提供了三种输出方式

#include <iostream>
#include <cmath>
#include <iomanip>

int main() {
    char s;
    int number, n = 0;
    long long result=0;
    while (std::cin >> number) {
        result += number;
        n++;
    }
    std::cout <<  std::fixed <<  std::setprecision(0) << result * pow(2, n-1)  << std::endl;
    //std::cout << (long long) result * pow(2, n - 1) << std::endl; //存在使用e输出法的问题
    printf("%lld\n", (long long)(result * pow(2, n-1) ));
    result *= pow(2, n - 1);
    printf("%lld", result);
    return 0;
}

posted @   DawnTraveler  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示