今天给大家讲解集合求和这个题目
题目传送们 洛谷
题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素<=1000)
输出格式
和
输入输出样例
输入 #1
2 3
输出 #1
10
说明/提示
子集为:
[] [2] [3] [2 3] 2+3+2+3=10
保证结果在10^18以内。
思路
这个题目竟然都谈到了集合,那肯定是考我们数论的了。
众所周知给定了一个集合,元素为
a
1
,
a
2
,
a
3......
a
n
a1,a2,a3......an
a1,a2,a3......an,让你求出它所有子集的公式就是
(
a
1
+
a
2
+
a
3
+
.
.
.
.
.
.
+
a
n
)
∗
(a1+a2+a3+......+an)*
(a1+a2+a3+......+an)∗ 2n-1。
接下来给大家推导以下公式:
我们知道一个元素个数为
n
n
n的集合存在2n个子集,并且根据排列组合,我们可以推出每个数字在每个子集中出现的次数为2n-1。所以我们所有子集之和就是所有元素之和*2n-1。
既然都知道了数学公式,那还有什么可以犹豫的,直接上代码!
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long tmp,num=0,sum=0;
while(cin>>tmp)//输入
{
sum+=tmp;num++;
}
long long ans=sum*pow(2,num-1);//直接套公式
cout<<ans;//输出
return 0;
}