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;
}
posted @ 2025-03-17 20:08  Marinaco  阅读(36)  评论(0)    收藏  举报
//雪花飘落效果