• 【蓝桥杯2025备赛】集合求和


    集合求和

    题目描述

    给定一个集合 s s s(集合元素数量 ≤ 30 \le 30 30),求出此集合所有子集元素之和。

    输入格式

    集合中的元素(元素 ≤ 1000 \le 1000 1000

    输出格式

    s s s 所有子集元素之和。

    样例 #1

    样例输入 #1

    2 3
    
    • 1

    样例输出 #1

    10
    
    • 1

    提示

    【样例解释】

    子集为: ∅ , { 2 } , { 3 } , { 2 , 3 } \varnothing, \{ 2 \}, \{ 3 \}, \{ 2, 3 \} ,{2},{3},{2,3},和为 2 + 3 + 2 + 3 = 10 2 + 3 + 2 + 3 = 10 2+3+2+3=10


    【数据范围】

    对于 100 % 100 \% 100% 的数据, 1 ≤ ∣ s ∣ ≤ 30 1 \le \lvert s \rvert \le 30 1s30 1 ≤ s i ≤ 1000 1 \le s_i \le 1000 1si1000 s s s 所有子集元素之和 ≤ 10 18 \le {10}^{18} 1018

    标签:集合论,数学,排列组合

    知识点:

    • 集合所有子集中的每个元素个数总和是相等的

    • 集合所有子集之和= s u m ∗ 2 n − 1 sum*2^{n-1} sum2n1(n代表元素的个数,sum是元素的和)

    思路

    我们先模拟一下,求集合所有子集之和的过程

    以A= { 1 , 2 , 3 , 4 } \left\{1,2,3,4\right\} {1,2,3,4}为例

    • 0 元子集 : 0元子集: 0元子集: ∅ \varnothing

    • 1 元子集 : { 1 } 1元子集:\left\{1\right\} 1元子集:{1} { 2 } \left\{2\right\} {2} { 3 } \left\{3\right\} {3} { 4 } \left\{4\right\} {4}

    • 2 元子集 2元子集 2元子集 { 1 , 2 } \left\{1,2\right\} {1,2} { 1 , 3 } \left\{1,3\right\} {1,3} { 1 , 4 } \left\{1,4\right\} {1,4} { 2 , 3 } \left\{2,3\right\} {2,3} { 2 , 4 } \left\{2,4\right\} {2,4} { 3 , 4 } \left\{3,4\right\} {3,4}

    • 3 元子集 : 3元子集: 3元子集: { 1 , 2 , 3 } \left\{1,2,3\right\} {1,2,3} { 1 , 2 , 4 } \left\{1,2,4\right\} {1,2,4} { 1 , 3 , 4 } \left\{1,3,4\right\} {1,3,4} { 2 , 3 , 4 } \left\{2,3,4\right\} {2,3,4}

    • 4 元子集 : 4元子集: 4元子集: { 1 , 2 , 3 , 4 } \left\{1,2,3,4\right\} {1,2,3,4}

    我们仔细观察一下所有的集合,我们可以发现1出现的次数和2,3,4出现的次数是相等的,出现了八次

    我们可以猜想在集合所有子集中每个元素出现次数为 2 n − 1 2^{n-1} 2n1次,集合A中所有元素之和为sum

    所有子集之和 = 所有子集之和= 所有子集之和= s u m ∗ 2 n − 1 sum*2^{n-1} sum2n1

    下面是我朴素的推理过程,不保证对,发现不对之处还望指出,万分感谢!!!

    在这里插入图片描述

    在这里插入图片描述

    ok,那就直接上代码了

    #include
    #define int long long
    int a[1005];
    int ans,sum;
    signed main()
    {
        int s;
        while(scanf("%lld",&s)!=-1)
        {
            if(a[s]==0){ans+=s;sum++;}
        }
        ans*=pow(2,sum-1);
        printf("%lld",ans);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们下期再见!!!

  • 相关阅读:
    Super easy to understand decision trees (part one)
    python jupyter notebook打开页面方便使用
    [RK-Linux] recovery分区详解(一)
    CMake:构建时运行自定义命令add_custom_command
    飞塔防火墙HA详解与配置
    python函数式编程
    vscode下无法识别node、npm的问题
    不会吧!不会吧!居然还有人不知道重绘以及回流
    OpenSSL安装过程总结
    【dubbo3.x trace组件分享】
  • 原文地址:https://blog.csdn.net/2301_79728896/article/details/138045536