题目描述
期望的线性性
和的期望=期望的和。
因此计算每个节点期望贡献再加起来即可。
一个结点的期望深度与其数值大小和所在数组位置无关,因此可以一视同仁。
假设还有i颗子树,我们显然知道一个结点肯定处于一颗子树内。只有在该轮其所在子树被合并时深度才会加一,所以贡献为被合并的概率*1。被合并的概率是
i−1C2i=2i
所以答案就是
(∑ni=1ai)∗(∑ni=22i)
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100000+10,mo=1000000007;
int i,j,k,l,t,n,m,ans;
int quicksortmi(int x,int y){
if (!y) return 1;
int t=quicksortmi(x,y/2);
t=(ll)t*t%mo;
if (y%2) t=(ll)t*x%mo;
return t;
}
int main(){
freopen("huffman.in","r",stdin);freopen("huffman.out","w",stdout);
scanf("%d",&n);
fo(i,1,n){
scanf("%d",&j);
(t+=j)%=mo;
}
fo(i,2,n)
(l+=(ll)quicksortmi(i,mo-2)*2%mo)%=mo;
ans=(ll)t*l%mo;
fo(i,2,n) ans=(ll)ans*((ll)i*(i-1)/2)%mo;
printf("%d\n",ans);
}