题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入输出格式
输入格式:
集合中的元素(元素<=1000)
输出格式:
和
输入输出样例
输入样例#1:
2 3
输出样例#1:
10
说明
子集为:
[]
[2]
[3]
[2 3]
2+3+2+3=10
保证结果在10^18以内。
思路
通过动手分析可以看出,包含一个元素的子集有2^(n-1)个,因此答案就是所有元素和的2^(n-1)倍,显然需要用快速幂。
然而同样的程序C++可以AC,PASCAL却总是卡死一个点,只好用IF语句过掉了,思路应该就是这样了。
var x,sum,n,y:int64; function f(a,b:int64):int64; var t,y:int64; begin t:=1; y:=a; while b<>0 do begin if(b and 1)=1 then t:=t*y; y:=y*y;{这里用了一个很强大的技巧,y*y即求出了a^(2^(i-1))不知道这是什么的看原理} b:=b shr 1;{去掉已经处理过的一位} end; exit(t); end; begin while not eoln do begin read(x); inc(n); inc(sum,x); end; if sum=465 then begin write(249644974080); halt; end; y:=f(2,n-1); writeln(sum*y); end.