Codeforces 810C Do you want a date 枚举

来源:互联网 发布:己知直径求周长 编辑:程序博客网 时间:2024/06/06 01:27

点击打开链接

题意:

n个数,n<=3e5,2^n-1个非空集合 F(a)定义为集合a中最大值-最小值之差 求所有F(a)之和mod1e9+7 
//sort后 枚举最小值为i,则ans+=(a[j]-a[i])*2^(j-i-1) (j=i+1~n) 
//化解:一个数a[i]总共减了:a[i]*(2^0~2^(n-i-1)) 加了a[i]*(2^0+~2^(i-2)) 

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=3e5+20;const int M=3e5+5;const ll mod=1e9+7;ll n,a[N];ll pw2[N];int main(){pw2[0]=1;for(int i=1;i<=M;i++)pw2[i]=(pw2[i-1]*2ll)%mod;while(cin>>n){for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);sort(a+1,a+1+n);ll ans=0;for(int i=1;i<=n;i++){ll sub,add;if(i==n)sub=0;elsesub=(a[i]*(pw2[n-i]-1)+mod)%mod;if(i==1)add=0;elseadd=(a[i]*(pw2[i-1]-1)+mod)%mod;ans=(ans-sub+mod)%mod;ans=(ans+add)%mod;}cout<<ans<<endl;}return 0;}



原创粉丝点击