P2415集合求和-----洛谷AC

文章讲述了如何利用数学方法计算给定集合所有子集元素之和,涉及子集生成、元素和的规律以及编程实现。重点在于理解和应用求和公式。
摘要由CSDN通过智能技术生成

题解

题目描述

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

输入格式

集合中的元素(元素 ≤1000)

输出格式

s 所有子集元素之和。

输入输出样例

输入 #1

2 3

输出 #1

10

说明/提示

【样例解释】

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


【数据范围】

对于100% 的数据,1≤∣s∣≤30,1≤s[i]​≤1000,s 所有子集元素之和≤10^18。

分析

首先,题目中并没有提示输入终止的条件,因此输入是个问题;

其次,我们来分析一下子集元素和的规律:

 集合                    子集                                 和

 {2}                      {2}                                     2

{2,3}                    {2},{3},{2,3}                      2+3+2+3(2*(2+3))即(2^(2-1)*(2+3))

{1,2,3}    {1},{2},{3},{1,2},{1,3},{2,3} ,{1,2,3}    #1+2+3+1+2+1+3+2+3+1+2+3(4*(1+2+3))#

                                                                       #即2^(3-1)*(1+2+3)                                     #

{1,2,3,4}           # {1},{2},{3},{4},{1,2},   #         # 1+2+3+4+1+2+1+3+1+4+2+3+2+4+3+4 #

                         #{1,3},{1,4},{2,3} ,{2,4},#        #+1+2+3+1+2+4+1+3+4+2+3+4+1+2+3+4#

                         # {3,4},{1,2,3},{1,2,4},  #        #( 8*(1+2+3+4)即2^(4-1)*(1+2+3+4)        #

                         #{1,3,4},{2,3,4},{1,2,3,4}   

由上便得出规律:

当集合共有n个元素时,

{1+2+3+4+5+...+n}              ......             

和为                                                                2^(n-1)*(集合所有元素之和,即1+2+3+...+n)                              

于是,就可以写代码了... 

参考AC代码


#include <bits/stdc++.h>//万能头文件

using namespace std;

int main() {
    //数据范围超过int类型,因此要用long long
    // 数据输入个数
    long long n;
    // 元素个数
    long long t= 0;
    // 最终求和
    long long sum = 0;
    // 将所有数据求和 并记录个数
    while (cin >> n) {
        sum += n;
        t++;
    }
   
    cout << (long) pow(2, t - 1) * sum << endl;/*公式,  2^(n-1)*(集合所有元素之和,即              1+2+3+...+n)            pow为幂函数*/

    //                     

    return 0;

}

感受

这道题趋向于数学范畴,要找规律,将所有子集列出来后再得出求和公式,方能AC.

END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值