G-小红的陡峭值
题目链接: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;
}

浙公网安备 33010602011771号