题目链接:https://ac.nowcoder.com/acm/contest/103152/G
题意:
给定一个数组,规定其陡峭值为相邻两个元素之差的绝对值之和,将其打乱后,求其陡峭值的期望
思路:
计数问题,期望=不同陡峭值之和(总陡峭值)/n的阶乘
考虑其中两个元素对答案的贡献,记这两个元素为(a,b)
总方案数有多少个它俩相邻的?应该是:(n-2)!(n-1)=(n-1)!(捆绑法)
反过来也一样,所以最后的总陡峭值要乘以2
对于ai (ai-a1)+(ai-a2)+.....(ai-ai-1)=(i-1)*ai-(a1+a2+...ai-1)
前缀和加速右边一项,所以可达O(n)枚举
int quickpow(int a,int b,int p){int res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;
}void solve(){int n;cin>>n;vector<int>a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}sort(a.begin(),a.end());vector<int>pre(n+1,0);for(int i=1;i<=n;i++){pre[i]=pre[i-1]+a[i];}int sum=0;for(int i=1;i<=n;i++){int res=((i-1)*a[i]%mod-(pre[i-1])%mod+mod)%mod;sum+=res;sum%=mod;}sum=(sum*2)%mod;int rev=quickpow(n,mod-2,mod)%mod;cout<<(sum*rev)%mod<<endl;
}