P2415 集合求和(一道洛谷好题鸭)(虽然可以水过,但有必研究DP)
此题坑点:
结果必须要用long long存,int存不下
如果想要像
cout<<sum*pow(2,num-1)这样在输出时计算会错:
long long在计算过程被隐式转换成了double,需要用强制类型转换转换回long long输出。集合论和排列组合公式初中还没学
题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
分析
我们来看一个例子: \{1,2,3\}{1,2,3}
可以得到,它的所有非空子集为 \{1,2,3\}{1,2,3} \{1,2\}{1,2}\{2,3\}{2,3} \{1,3\}{1,3} \{1\}{1} \{2\}{2} \{3\}{3}
现在来分析每一个元素在每一个子集中出现的个数:
11出现了44次,22出现了44次,33出现了44次
我们猜测:对于一个有限集合AA,它的每一个元素在AA的所有子集中出现的个数是{2^{\operatorname{card}(A)-1}}2card(A)−1
证明:(集合论纯自学,可能格式有误, 请别在意QAQ)
设B\subseteq AB⊆A, 记n=\operatorname{card}(A)n=card(A), ss为AA中所有元素之和
当\operatorname{card}(B)=1card(B)=1时,显然,每个元素在BB中出现11次;
当\operatorname{card}(B)=2card(B)=2时,保证一个元素必选,在剩余的n-1n−1个元素中选择11个元素,共C^1_{n-1}=n-1Cn−11=n−1种情况,故每个元素在BB中出现C^1_{n-1}=n-1Cn−11=n−1次;
当\operatorname{card}(B)=3card(B)=3时,保证一个元素必选,在剩余的n-1n−1个元素中选择22个元素,共C^2_{n-1}=\frac{(n-1)!}{2(n-1-2)!}=\frac{(n-1)(n-2)}{2}Cn−12=2(n−1−2)!(n−1)!=2(n−1)(n−2)种情况,故每个元素在BB中出现共C^2_{n-1}=\frac{(n-1)(n-2)}{2}Cn−12=2(n−1)(n−2)次;
当\operatorname{card}(B)=kcard(B)=k时,保证一个元素必选,在剩余的n-1n−1个元素中选择k-1k−1个元素,共C^{k-1}_{n-1}Cn−1k−1种情况,故每个元素在BB中出现共C^{k-1}_{n-1}Cn−1k−1次;
那么,每个元素在AA的每一个子集中出现的个数为: \sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑nCn−1i−1=2n−1 ①
AA的所有子集元素之和为s\times2^{n-1}s×2n−1
故代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long tmp,num=,sum=;
while(cin>>tmp){
sum+=tmp;
num++;
}//读入集合元素个数num和元素和sum
cout<<(long long)(sum*pow(,num-));
//必须显式地转换为long long输出
}
①: 不懂为什么\sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑nCn−1i−1=2n−1的可以看一下数学归纳法证明:
将用到的性质公式:
- C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1}Cnm=Cn−1m−1+Cn−1m
- C^n_n=C^0_n=1Cnn=Cn0=1
\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑nCni=2n
证明:
1)当n=1n=1时:
\sum\limits_{i=0}^{n}C^{i}_{n}=C^0_1+C^1_1=2=2^1i=0∑nCni=C10+C11=2=21
等式成立。
2)假设当n=k(k\in N_+)n=k(k∈N+)时\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑nCni=2n 成立, 即\sum\limits_{i=0}^{k}C^{i}_{k}=2^{k}i=0∑kCki=2k
那么当n=k+1n=k+1时:
\text{\ \ \ \ } \sum\limits_{i=0}^{k+1}C^{i}_{k+1}i=0∑k+1Ck+1i
=C^{0}_{k+1}+C^{1}_{k+1}+C^{2}_{k+1}+...+C^{k}_{k+1}+C^{k+1}_{k+1}=Ck+10+Ck+11+Ck+12+...+Ck+1k+Ck+1k+1
=C^{0}_{k+1}+(C^{0}_{k}+C^{1}_{k})+(C^{1}_{k}+C^{2}_{k})+...+(C^{k-1}_{k}+C^{k}_{k})+C^{k+1}_{k+1}=Ck+10+(Ck0+Ck1)+(Ck1+Ck2)+...+(Ckk−1+Ckk)+Ck+1k+1
=C^{0}_{k}+(C^{0}_{k}+C^{1}_{k})+(C^{1}_{k}+C^{2}_{k})+...+(C^{k-1}_{k}+C^{k}_{k})+C^{k}_{k}=Ck0+(Ck0+Ck1)+(Ck1+Ck2)+...+(Ckk−1+Ckk)+Ckk
=2(C^0_k+C^1_k+C^2_k+...+C^k_k)=2(Ck0+Ck1+Ck2+...+Ckk)
=2\sum\limits_{i=0}^{k}C^{i}_{k}=2i=0∑kCki
=2\times2^k=2×2k
=2^{k+1}=2k+1
此时等式依然成立。假设成立。
故\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑nCni=2n
由此可以得到,\sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑nCn−1i−1=2n−1
P2415 集合求和(一道洛谷好题鸭)(虽然可以水过,但有必研究DP)的更多相关文章
- P2415 集合求和
P2415 集合求和显然,一共有2^n个子集,对于其中的一个确定的元素,它不在的集合有2^(n-1),相当于有n-1元素,那么它存在的集合有,2^n-2^(n-1)==2^(n-1),那么集合的和为s ...
- 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)
上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- 洛谷 P3287 - [SCOI2014]方伯伯的玉米田(BIT 优化 DP)
洛谷题面传送门 怎么题解区全是 2log 的做法/jk,这里提供一种 1log 并且代码更短(bushi)的做法. 首先考虑对于一个序列 \(a\) 怎样计算将其变成单调不降的最小代价.对于这类涉及区 ...
- 【题解】洛谷P1373 小a和uim之大逃离(坐标DP)
次元传送门:洛谷P1373 思路 设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1) 那么转移就很明显了 f[i][j][t][]=(f ...
- 洛谷 P4125 [WC2012]记忆中的水杉树【扫描线+set+线段树】
我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问, ...
- 洛谷 P2415 集合求和【数学公式/模拟】
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出 ...
- 洛谷P2415 集合求和
题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 ...
随机推荐
- 2019年Unity学习资源指南[精心整理]
前言 进入一个领域,最直接有效的方法就是,寻找相关综述性文章,首先你需要对你入门的领域有个概括性的了解,这些包括: 1.主流的学习社区与网站. 2.该领域的知名大牛与热心分享的从业者. 3.如何有效的 ...
- 初识mysql索引 - 小白篇
:接触mysq也有两年左右的时间了,但是对该数据库的理解自认还比较初级,看过很多文章,也看过一些相关的书籍,依然小白....(这里个人总结是两点主要原因:1.对mysql的学习大部分都是源于看一些杂七 ...
- element 自定义 el-loading
前言 虽说,el-loading 自带的loading效果已经满足日常的需求看 但是,美术大大觉得太low 我要我设计的,我不要你觉得我要我觉得 需求 自定义el-loading 正文 从官方需求文 ...
- Hive数据仓库你了解了吗
在工作中我们经常使用的数据库,数据库一般存放的我们系统中常用的数据,一般为百万级别.如果数据量庞大,达到千万级.亿级又需要对他们进行关联运算,该怎么办呢? 前面我们已经介绍了HDFS和MapReduc ...
- NOIP模拟测试6
看题目就知道这是一个悲伤的故事... 但还有更悲伤的 考崩了,难以描述. T1把数据范围看成2^12,我TM也是够了... T2思路接近正解,但不知道想了个神魔东西跑了N遍dijstra T3最狗了, ...
- Dart编程语言从基础到进阶1
Dart编程语言从基础到进阶Dart的语言的发展史以及Dart能做什么未来发展怎么样等等问题我们在这里是不讨论的.我相信既然选择了来学习它,那你内心基本已经认可了它,所以我们废话不多说直接进入主题. ...
- js 把数组中每个元素的某个字段取出
方法一:map() let cities = [ {city:"北京",bOn:false}, {city:"上海",bOn:false}, {city:&qu ...
- [LC]237题 Delete Node in a Linked List (删除链表中的节点)(链表)
①中文题目 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...
- Java开发者入职必备条件
01.基础技术体系 我认为知识技能体系化是判断技术是否过关的第一步.知识体系化包含两层含义: 1. 能够知道技术知识图谱(高清版图谱扫文末二维码)的内容 比如分布式系统中常用的RPC技术,其背后就涉及 ...
- JS如何在不给新空间的情况下给数组去重?
1.先排序,在让相邻元素对比去重 const nums = [3, 1, 1, 5, 2, 3, 4, 3, 5, 5, 6, 4, 6, 6, 6]; Array.prototype.arrayNo ...