• [洛谷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
  • 相关阅读:
    less的使用
    04 LeetCode --- 反转整数
    03 LeetCode --- 反转整数
    数据结构--- 队列
    数据结构---栈
    数据结构---列表与数组
    04-配置阿里云yum源并启动nginx服务
    03-linux命令
    02-windows下vmware配置nat网络
    01-xshell连接linux
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4751085.html
Copyright © 2020-2023  润新知