题意
求一个集合的所有非空子集的最大数与最小数之差的和对
109+7
取模的结果
思路
考虑每个数可以作为多少个子集最大数,多少个子集的最小数,先对集合中的数从小到大排个序,对于第i位,i从0开始,它作为最大数就是在比它小的i个数中至少取1个,取它且不取比它大的数,那么数量就是
2i−1
,它作为最小数就是在比它大的(n-1-i)个数中至少取1个,取它且不取比它小的数,那么数量就是
2n−1−i−1
,那么我们对于每个数,就加上它乘它作为最大数的集合数量减去它乘它作为最小数的集合数量,算完所有数就可以了,注意取模操作
代码
#include <cstdio>
#include <algorithm>
using namespace std;
#define mod 1000000007
long long x[300001];
long long mul[300001];
int main()
{
long long n,ans;
scanf("%I64d",&n);
for(long long i=0;i<n;i++)
scanf("%I64d",&x[i]);
mul[0]=1;
for(long long i=1;i<=n;i++)
mul[i]=(mul[i-1]*2)%mod;
sort(x,x+n);
ans=0;
for(long long i=0;i<n;i++)
{
ans=(ans+(x[i]*((mul[i]-1+mod)%mod))%mod)%mod;
ans=(ans-(x[i]*((mul[n-1-i]-1+mod)%mod))%mod+mod)%mod;
}
printf("%I64d\n",ans);
return 0;
}