题目:
题意:
长度为2n的数列a分为长度为n的数列p和q,按非递减的顺序对数列 p排序,而数列 q按非递增的顺序排序。定义,求所有的值的和
分析:
假设在a中前n小的数字p取了m个,则排序后这m个数在后m位,而a中前n大的数字q也取了m个,排序后这m个数也在后m位,因此不论如何取数,的值都为前n大的数-前n小的数。因此只需要求出所有p、q的组合再乘上,便可,结果为。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
long long sum[2000100];
long long sum3[2000100];
long long a[2001000];
inline long long qpow(long long x,long long b){
long long ans=1;
while(b){
if(b&1)ans=ans*x%mod;
x=x*x%mod;
b>>=1;
}
return ans;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=2*n;i++){
scanf("%lld",&a[i]);
}
sum[n]=1ll;
for(long long i=n+1;i<=2*n;i++){
sum[i]=sum[i-1]*i%mod;
}
//cout<<sum[n]<<endl;
sum3[0]=1ll;
for(long long i=1;i<=n;i++){
sum3[i]=sum3[i-1]*i%mod;
}
sum[2*n]=sum[2*n]%mod*qpow(sum3[n],mod-2)%mod;
sort(a+1,a+2*n+1);
long long sum1=0,sum2=0;
for(int i=1;i<=n;i++){
sum1=(sum1+a[i])%mod;
}
for(int i=n+1;i<=2*n;i++){
sum2=(sum2+a[i])%mod;
}
long long ans=(sum2-sum1+mod)%mod;
printf("%lld",(ans*sum[2*n]+mod)%mod);
return 0;
}