洛谷-P2415 集合求和
1.题目介绍
2.题解
这里我们可以针对单个元素可能出现的子集个数进行统计, 而不是以集合为单位
比如像我们讨论{2,3,4,5}中 2的所有可能出现次数
可以分为:
- 2在子集中单独出现
- 2在子集中和另一个元素一起出现
- 2在子集中和另两个元素一起出现
- 2在子集中和剩下所有元素一起出现
我们发现一共就只有这几种情况,2不可能有其他的出现情况,那么元素2能构成的自己元素和就是
2(值) * , 而其他的元素同理(出现次数是相同的),最终就可以获得所有子集元素和 = (元素和)* 出现次数
至于为何
可以使用数学归纳法:
1.对于
2.假设对于n = k,
3.对于n = k + 1,
此时n = k + 1, 所以推理成立!
代码
提供了三种输出方式
#include <iostream>
#include <cmath>
#include <iomanip>
int main() {
char s;
int number, n = 0;
long long result=0;
while (std::cin >> number) {
result += number;
n++;
}
std::cout << std::fixed << std::setprecision(0) << result * pow(2, n-1) << std::endl;
//std::cout << (long long) result * pow(2, n - 1) << std::endl; //存在使用e输出法的问题
printf("%lld\n", (long long)(result * pow(2, n-1) ));
result *= pow(2, n - 1);
printf("%lld", result);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了