拆成两个部分分别算显然比较简单。
前面一个部分排个序枚举最大值算就好啦。
后面的就相当于把每一种数值的贡献加起来,也可以在排完序之后的a[]上面直接算出来。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5,ha=1e9+7;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;}
int n,a[N],ans,c[N];
inline void calc(){
for(int i=1;i<=n;i++) ADD(ans,a[i]*(ll)c[i-1]%ha);
for(int i=1,now=0;i<=n;i++){
now++;
if(a[i]!=a[i+1]) ADD(ans,add(ha-c[n],c[n-now])),now=0;
}
}
int main(){
scanf("%d",&n);
c[0]=1; for(int i=1;i<=n;i++) c[i]=add(c[i-1],c[i-1]);
for(int i=1;i<=n;i++) scanf("%d",a+i);
sort(a+1,a+n+1);
calc();
printf("%d
",ans);
return 0;
}