解析
这个题目用的是排列组合的相关知识,在高中高二下学期学习.
一个长度为n的序列,共有多少个子集?
Cn0+Cn1+⋯+Cnn=i=0∑nCni=2n那么这些子集中,第一人元素a1,出现过多少次?这个问题显然等价于含有a1的子集有多少个.
使用数学的化归思维:
- 从n个元素里,把a1拿走,剩余n−1个元素
- 在剩余的n−1个元素里,任意形成子集xi,显然有2n−1个
- 然后把拿走的a1放到每个xi子集里,
这样就保证每个子集都有a1里,所以得出含有a1的元素共有2n−1个,同理ai元素在所有的子集中也出现了2n−1个
所以最终的答案为
ans=2n−1a1+2n−1a2+⋯+2n−1an=2n−1(a1+a2+⋯+an)=2n−1i=1∑nai
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
long long sum;
long long cnt;
int main () {
long long t;
while(cin >> t) {
sum += t;
cnt++;
}
cout << sum*(1 << (cnt-1));
return 0;
}