Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum (思维,数学,逆元)
2024-09-03 23:07:58
题意:有一个长度为\(2n\)数组,从中选分别选\(n\)个元素出来组成两个序列\(p\)和\(q\),(\(p\)和\(q\)中只要有任意一个元素在\(a\)的原位置不同,就算一个新的情况),选完后对\(p\)非降序排序,对\(q\)非升序排序,然后求它们每个元素对应位置的差的绝对值之和\(re s=\sum^{n}_1 |x_i-y_i|\),问所有情况的res总和.
题解:观察样例,不难发现,因为\(p\)非降序,\(q\)非升序,所以无论\(p\)和\(q\)怎么选,它们的贡献永远是排序后的后\(n\)个数之和减前\(n\)个数之和,证明可以去看这个:https://www.luogu.com.cn/blog/taskkill-SB/solution-cf1444b
所以我们要求的答案就是\((\sum^n_1 |x_i-y_i|)*C^n_{2n}\).用逆元算一下即可.感觉自己对需要取模求逆元的题目还是十分的不熟练啊.
代码:
int n;
int a[N];
int fac[N],inv[N];
int ans; int fpow(int a,int k){
int res=1;
while(k){
if(k&1) res=res%mod*a%mod;
k>>=1;
a=a%mod*a%mod;
}
return res;
} signed main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=2*n;++i) cin>>a[i];
sort(a+1,a+1+2*n);
fac[0]=1;
for(int i=1;i<=2*n;++i){
fac[i]=fac[i-1]%mod*i%mod;
inv[i]=fpow(fac[i],mod-2);
}
int invC=fac[n<<1]*inv[n]%mod*inv[n]%mod;
for(int i=1;i<=n;++i){
ans=(ans-invC*a[i]%mod)%mod;
}
for(int i=n+1;i<=2*n;++i){
ans=(ans+invC*a[i]%mod)%mod;
} cout<<(ans+mod)%mod<<'\n'; return 0;
}
最新文章
- [游戏开发-学习笔记]菜鸟慢慢飞(九)- NGUI- UIWidget(官方说明翻译)
- [No000020]背单词提不起兴趣怎么办?
- vrrp两用
- 李洪强iOS开发之代理
- Qt自定义带游标的slider,在滑块正上方显示当前值(非常有意思,继承QSlider之后增加一个QLabel,然后不断移动它)
- batch 批处理获取系统时间
- android项目总体界面架构(可直接复用)
- 十六进制颜色与Color对象的互相转换[C#]
- Codeforces Round #410 (Div. 2)C题
- poj2793 素数和
- 使用MFC创建C++程序
- [No0000CD]shell 中的单行注释和多行注释
- 03 编写URL规则
- [ios][swift]UIButton
- Linux系统下安装jdk1.8
- 【移动端debug-1】css3中box-shadow的溢出问题
- 自然语言处理NLTK
- 制作rpm安装包
- ARM v8-A 系列CPU的MMU隐射分析
- 解决最新版 mac os sierra usb网卡不能使用的问题
热门文章
- Session、Cookie与Token
- 【Web】CSS中的浮动float
- 用percona monitoring plugins 监控mysql
- 【Linux】ethtool 用法
- leetcode 357. 计算各个位数不同的数字个数(DFS,回溯,数学)
- VBScript调用winscp,实现sftp操作
- django模板中导入js、css等静态文件
- Bitter.Core系列六:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 DataTable 模型转换
- 一文打尽 Linux/Windows端口复用实战
- AES加密模式