小 H
有一个长度为 2 n 2n 2n 的数列 C C C,但是他想拥有两个数列。于是他想从原数列中取出 n n n 个数作为数列 A A A,剩下 n n n 个数作为数列 B B B,这样就将一个数列拆分成了两个。
小 H
决定乱序的数组不够优美,因此他决定将数列 A A A 中的数从小到大排序,将数列 B B B 中的数从大到小排序,这样,数列看上去就十分整齐了。
小 H
认为拆分成数列 A A A 和数列 B B B 的优美程度为 ∑ i = 1 n ∣ A i − B i ∣ \sum_{i=1}^{n}{|A_i-B_i|} ∑i=1n∣Ai−Bi∣。
小 H
原来想选出最优美的两个数列,但是他发现有选择困难症,所以他想知道,如果他随机拆分,数列 A A A 和数列 B B B 的期望优美程度是多少。
第一个一正整数 n n n。
第二个 2 n 2n 2n 正整数,第 i i i 个数表示 c i c_i ci。
一个数表示数列 A A A 和数列 B B B 的期望优美程度 m o d 998244353 \bmod ~ 998244353 mod 998244353。
样例输入1
3 2 1 3 2 1 4
样例输出1
5
样例输入1
5 13 8 35 94 9284 34 54 69 123 846
样例输出1
10272
对于 20 % 20 \% 20% 的数据, n ≤ 10 n \le 10 n≤10。
对于 40 % 40 \% 40% 的数据, n ≤ 100 n \le 100 n≤100。
对于 60 % 60 \% 60% 的数据, n ≤ 5000 n \le 5000 n≤5000。
对于 80 % 80 \% 80% 的数据, n ≤ 1 0 5 n \le 10^5 n≤105。
对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 1 0 6 , 1 ≤ c i ≤ 1 0 9 1 \le n \le 10^6, 1 \le c_i \le 10^9 1≤n≤106,1≤ci≤109。
可以发现,前 n n n 大的数一定被减,后 n n n 大一定作减数。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=998244353;
ll read(){
ll op=1,sum=0;char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') op=-1;ch=getchar();}
while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
return op*sum;
}
ll a[2000005];
int main(){
int n=read();
for(int i=1;i<=2*n;++i)a[i]=read();
sort(a+1,a+1+2*n);
ll ans=0;
for(int i=1;i<=n;++i)ans=(ans+a[i+n]-a[i])%mod;
printf("%lld\n",(ans+mod)%mod);
return 0;
}