zoukankan      html  css  js  c++  java
  • [洛谷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
  • 相关阅读:
    0705. Design HashSet (E)
    VMware简单使用
    Git笔记
    初识MyBatis
    数据库连接池配置 testOnBorrow
    Redis list操作命令
    文件/目录对比:diff命令
    可用于区块链的共识算法
    分布式一致性算法,你确定不了解一下?
    Jmeter文件下载测试
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4751085.html
Copyright © 2011-2022 走看看