求对应的数,所有绝对值之差的和

该博客讨论了一道编程题目,涉及数组分组和排序后的和。博主指出,通过观察可以发现,无论怎样分组,总和(sum)是固定的。关键在于计算所有可能的分组方式(组合数),并使用快速幂求逆元来避免除法。博主提供了C++代码实现,计算了组合数并输出了固定sum值的总和。
摘要由CSDN通过智能技术生成

题意:

题目链接

有2n个数,需要把他们分解成两堆,每一堆选取n个数, 总共有c_{2n}^n种方式。对于每一种方式第一堆从小到大排序,第二堆从大到小排序。 求sum=\sum_{i=1}^n{|a1[i] - a2[i]|}

问所有的方式的sum之和是多少。

思路:

首先,有一个规律,无论怎么分组,sum值都是固定的。这个需要仔细观察。如果不知道这个规律,这个题就不知道怎么做了。

把sum值求出来,然后乘上方式的总数就行了。求组合数需要逆元,不能直接除。

#pragma warning(disable:4996)
#include<iostream>
#include<algorithm>
#include<map>
#include<cstdio>
#include<set>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 300005;
const ll mod = 998244353;
ll sum, n;
ll a[maxn], fac[maxn];
ll a1[maxn], a2[maxn];
void init() {
	fac[0] = 1;
	ll i;
	for (i = 1; i < maxn; i++)
	{
		fac[i] = (fac[i - 1] * i) % mod;
	}//预处理阶乘
}
ll qpow(ll a, ll c) {
	ll ans = 1;
	a %= mod;
	while (c)
	{
		if (c & 1)ans = (ans * a) % mod;
		a = (a*a) % mod;
		c /= 2;
	}
	return ans;//快速幂主要用来求逆元
}
ll com(ll n, ll m){
	return fac[n] * qpow(fac[m] * fac[n - m] % mod, mod - 2) % mod;
	//组合数公式,不能直接除,求逆元。
}
bool cmp(ll x, ll y) {
	return x > y;
}
int main()
{
	ll i, j, ans;
	init();
	scanf("%lld", &n);
	for (i = 1; i <= n; i++)
	{
		scanf("%lld", &a1[i]);
	}
	for (i = 1; i <= n; i++)
	{
		scanf("%lld", &a2[i]);
	}
	sort(a1 + 1, a1 + 1 + n);
	sort(a2 + 1, a2 + 1 + n, cmp);
	for (i = 1; i <= n; i++)
	{
		sum += abs(a1[i] - a2[i]);
		sum %= mod;
	}//求出固定值sum
	ans = com(2 * n, n) * sum % mod;
	cout << ans << endl;
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值