洛谷2415集合求和

洛谷2415集合求和
本题地址:
http://www.luogu.org/problem/show?pid=2415

题目描述

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

输入输出格式

输入格式:
集合中的元素(元素<=1000)

输出格式:

输入输出样例
输入样例#1:
2 3
输出样例#1:
10
说明
子集为:
[]
[2]
[3]
[2 3]
2+3+2+3=10
保证结果在10^18以内。

显然答案=一个元素的子集的和+两个元素的子集的和+……+ n 个元素的子集的和。我们考虑每一个元素,显然在第一个子集中出现 C(n1,0)=1 次,第二个子集中出现 C(n1,1) 次,第三个子集中出现 C(n1,2) 次……第i个子集中出现 C(n1,i1) 次(相当于固定住一个元素,其余 n1 个元素在剩下的 i1 个位置上进行组合)……第 n 个子集中出现 C(n1,n1)=1 次。可见任意一个元素出现次数= C(n1,0)+C(n1,1)++C(n1,n1)=2n1 (由杨辉三角或二项式定理可得),所以问题的解=(集合中所有元素的和) 2n1
(注:奇怪的洛谷把数组描述成了集合,即数据中是有重复元素的)
(再注:注意那坑爹的math.h,洛谷上cmath是无法编译的)
(再再注:我用的是++num,所以最后又减了一个1)

#include  
#include  
#include  
using namespace std;  
double sum=0,sum1=0;  
int a[1100],num=0;  
int main()  
{  
    while (cin>>a[++num])  
    {  
        /*for (int i=1;i<=num-1;++i) 
        if (a[i]==a[num]) 
        { 
            --num; 
            break; 
        }*/  
    }  
    --num;  
    for (int i=1;i<=num;++i) sum1+=a[i];  
    printf("%0.0lf",sum1*pow(2,num-1));  
    return 0;  
}  

你可能感兴趣的:(刷题)