>Link
ybtoj冲刺NOIP2021模拟赛B组Day4 T1
>Description
给定一个集合 S S S,求集合 S S S的所有非空子集中 最大值与最小值的差 的和,答案对 1 e 9 + 7 1e9+7 1e9+7取模
>解题思路
麻了,最近刚学集合一眼就看出来了QAQ
子集中只有最大值和最小值才能对答案产生贡献,所以考虑
S
S
S中每个元素作为子集中的最大/小值对答案的贡献
假设
x
x
x为最大值,就找比它小的元素跟它凑成一个集合,贡献为:
+
+
+方案数
∗
x
*x
∗x。最小值反之
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
#define N 1000010
using namespace std;
const LL Mod = 1e9 + 7;
int n;
LL a[N], ans, power[N];
int main()
{
freopen ("sum.in", "r", stdin);
freopen ("sum.out", "w", stdout);
scanf ("%d", &n);
for (int i = 1; i <= n; i++) scanf ("%lld", &a[i]);
sort (a + 1, a + 1 + n);
power[0] = 1;
for (int i = 1; i <= n; i++)
power[i] = (power[i - 1] * 2) % Mod;
for (int i = n; i >= 1; i--)
ans = (ans + (a[i] * power[i - 1]) % Mod) % Mod;
for (int i = 1; i <= n; i++)
ans = (ans - (a[i] * power[n - i]) % Mod + Mod) % Mod;
printf ("%lld", ans);
return 0;
}