洛谷2015年8月月赛第一题
题目背景
非常抱歉该题数据有误,已更正并进行重测。注意结果范围为10^18
题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入输出格式
输入格式:
集合中的元素(元素<=1000)
输出格式:
和
输入输出样例
输入样例#1:
2 3
输出样例#1:
10
说明
子集为:
[]
[2]
[3]
[2 3]
2+3+2+3=10
保证结果在10^18以内。
思路
写出事件的基本事件空间。以5为例,我们可以发现在有1,2,3,4,5的元素的集合中,每个数字依次出现了1,4,6,4,1次;以6为例,我们可以发现在有1,2,3,4,5,6的元素的集合中,每个数字依次出现了1,5,10,10,5,1次,正好为一个杨辉三角。(又是杨辉三角!!!)那么可以发现杨辉三角每排数字加和正好为2^n-1,那么可以用一个累加器计算n,另一个累加器计算数字综合,用快速幂求处sum*2^n-1即可。(即使开到了也只有80分)
var n,x,sum:qword; function f(a,b:qword):qword; var t,y:qword; begin t:=1; y:=a; while b<>0 do begin if (b and 1)=1 then t:=t*y; y:=y*y; b:=b shr 1; end; exit(t); end; begin n:=0; sum:=0; while not eoln do begin read(x); inc(n); inc(sum,x); end; dec(n); writeln(f(2,n)*sum); end.