题解 CF1444B 【Divide and Sum】
Zenith_Yeh · · 题解
很多同学都是通过手玩或打表找规律得到的。
规律是:结果是数列
为什么呢?
我们来证一下:
设数列
因为
所以
由于
所以答案为数列
上菜:
#include<bits/stdc++.h>
#define int long long//不开long long见祖宗
#define mod 998244353
using namespace std;
int n,a[150000*2+5],f[150000*2+5],inv[150000*2+5],ans;
int ksm(int x,int y)//由于要用到逆元求组合数,所以要快速幂
{ int res=1;
while(y)
{ if(y&1)res=x*res%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
signed main()
{ cin>>n;
for(register int i=1;i<=2*n;++i)cin>>a[i];
sort(a+1,a+n+n+1);//排序
f[0]=1;
for(register int i=1;i<=2*n;++i)//求逆元
{ f[i]=f[i-1]*i%mod;
inv[i]=ksm(f[i],mod-2);
}
for(register int i=2*n;i>=1;--i)//计算答案
{ if(i<=n)ans=(ans+mod-f[2*n]*inv[n]%mod*inv[n]%mod*a[i]%mod)%mod;//若为小的n个数,则减
else ans=(ans+f[2*n]*inv[n]%mod*inv[n]%mod*a[i]%mod)%mod;//若为大的n个数,则加
}
cout<<ans;
return 0;
}