[洛谷2415]集合求和

题目描述

给定一个集合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.  
View Code
原文地址:https://www.cnblogs.com/yangqingli/p/4751085.html