acm-(序列、贡献计算)Codeforces Round #680 (Div. 2) D. Divide and Sum

题面
传送门
先考虑将数组 a a a从小到大排列,对于 a [ 1 ∼ n ] a[1\sim n] a[1n]假设我们选择 x x x个数放在 p p p序列中,那么不难得到我们必须在 a [ n + 1 ∼ 2 n ] a[n+1\sim 2n] a[n+12n]中同样选择 x x x个数放在 q q q序列中。
对于特定的 p p p q q q而言,我们总是先拿出 p p p中最小的一个数与 q q q中最大的一个数作差求贡献,然后再拿出 p p p中第二小的一个数与 q q q中第二大的一个数作差求贡献…以此类推。

由于我们在 a [ 1 ∼ n ] a[1\sim n] a[1n]中选择了 x x x个数放在 p p p序列中,它们对应的分别是 a [ n + 1 ∼ 2 n ] a[n+1\sim 2n] a[n+12n]中的 x x x个被选择放在 q q q序列中的数。它们的绝对值差之和恰好为 a [ n + 1 ∼ 2 n ] a[n+1\sim 2n] a[n+12n]中的 x x x个数减去 a [ 1 ∼ n ] a[1\sim n] a[1n]中的 x x x个数,而考虑 p p p中最后 n − x n-x nx个数字一定出现于 a [ n + 1 ∼ 2 n ] a[n+1\sim 2n] a[n+12n],而 q q q中最后 n − x n-x nx个数字一定出现于 a [ 1 ∼ n ] a[1\sim n] a[1n],这样不难发现一个序列的贡献就是 s u m [ n + 1 ∼ 2 n ] − s u m [ 1 ∼ n ] sum[n+1\sim 2n]-sum[1\sim n] sum[n+12n]sum[1n],这是一个常数,而序列的选择方式一共有 ( 2 n n ) \tbinom{2n}{n} (n2n)种,故总贡献是 ( 2 n n ) [ s u m [ n + 1 ∼ 2 n ] − s u m [ 1 ∼ n ] ] \tbinom{2n}n [sum[n+1\sim 2n]-sum[1\sim n]] (n2n)[sum[n+12n]sum[1n]]

int c[maxn*2];
int main(){
	int n=rd(),sum=0;
	FOR(i,1,2*n+1)c[i]=rd();
	sort(c+1,c+2*n+1);
	FOR(i,n+1,2*n+1)sum=(sum+c[i])%mod;
	FOR(i,1,n+1)sum=(sum-c[i])%mod;sum=(sum%mod+mod)%mod;
	int a=1,b=1;
	FOR(i,1,2*n+1)a=1ll*a*i%mod;
	FOR(i,1,n+1)b=1ll*b*i%mod;b=1ll*b*b%mod;
	sum=1ll*sum*a%mod*qpow(b,mod-2,mod)%mod;
	wrn(sum);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值