P2415 集合求和 C++

该博客探讨了一个数学问题,涉及组合数的求和公式。作者通过分析子集的构成,展示如何计算每个元素在所有子集中出现的次数,并得出每个元素出现次数为2^(n-1)。最终,通过累加所有元素并乘以2^(n-1)得到所有子集的和。博客指出在编程实现时需要注意输入结束的控制和计算效率。
摘要由CSDN通过智能技术生成

日期:2021-04-24

作者:19届WY

标签:数学问题,控制输入结束,组合数求和&公式

题目描述

在这里插入图片描述

解题:

以第n个元素an为例,

  1. 当子集只有一个元素时,选中an,剩余n-1个元素不选,an出现C0n-1
  2. 当子集有两个元素时,先选中an,再从剩下的n-1个元素中选一个,是C1n-1种选法,所以an出现C1n-1
  3. 当子集中有三个元素时,先选中an,再从剩下的n-1个元素中选两个,C2n-1种选法,所以an出现C2n-1
  4. 依此类推, 当子集有n-1个元素时,先选中an,再从剩下的n-1个元素中选n-2个,是Cn-2n-1种选法,所以an出现Cn-2n-1
  5. 最后有n个元素时,只有一种情况,除了an,剩下n-1个元素都选,也就是an出现Cn-1n-1
  6. 这样累加an出现的次数,由组合数求和公式可知,C0n-1+C1n-1+C2n-1+……+Cn-1n-1 = 2n-1
  7. 所以每个元素出现的次数都是2n-1
  8. 把所有元素相加乘上2n-1即是所有子集的和
  9. 本题犯的小错误:①考虑sum的范围②考虑输入的结束,用cin.peek()!='\n\'会超时
#include<iostream>
#include <math.h>
using namespace std;
int main(){
	int a,i=0;
	long long sum=0;
	while(cin>>a){ //输入 control+z结束 
		sum += a;
		i++;
	}
	int x = pow(2,i-1);
	sum *= x;
	cout<<sum;
} 

补充一下组合数有关的公式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南大学苹果实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值