朱世杰恒等式的应用-以CF841C为例
题目大意
Codeforces 841C Leha and Function.
令\(F(n,k)\)为在集合\(\{x|x \in [1,n]\}\)中选择一个大小为k的子集,最小元素的期望值。
给定数组\(a_i,b_i\),满足\(\forall_{i,j}a_i \geqslant b_j\).求出\(a_i\)的一个排列\(a'_i\),使得\(\sum_{i} F(a_i,b_i)\)最大。
朱世杰恒等式
在这里介绍一个非常有用的关于组合数求和的公式——朱世杰恒等式(i.e. Hockey-stick identity):
\[
\sum_{i=m}^{n}\dbinom{i}{k} = \dbinom{n+1}{k+1} - \dbinom {m}{k+1}
\]
当\(m=k\)时:
\[
\sum_{i=m}^n \dbinom{i}{m} = \dbinom {n+1}{m+1}
\]
不失一般性,对于特殊情况作出证明,容易推广到第一个式子。
证明
对\(n\)施用数学归纳法。
当\(n=m\)时, 显然成立.
对于\(n-1 \geqslant m\), 假设对于\(n-1\)成立, 那么:
\(\sum_{i=m}^{n-1} \dbinom im = \dbinom {n}{m+1}\).
\(\sum_{i=m}^n \dbinom im = \dbinom{n}{m+1} + \dbinom {n}{m} = \dbinom {n+1}{m+1}\)
Q.E.D.
其他证明方法见维基百科
关于F(n,k)的推演
在比赛中, 我首先得到了\(F(n,k)\)的递推式:
\[F(n,k) = \frac kn F(n-1, k-1) + (1-\frac kn) F(n-1, k)\].
我们可以使用强数学归纳法证明:
\[F(n,k) = \frac {n+1}{k+1}\].
不过, 有一个更为简单的方法:
显然,
\[F(n,k) = \frac {1}{\dbinom{n}{k}}\sum_{i=1}^n i \dbinom{n-i}{k-1} \]
而:
\[\sum_{i=1}^n i\dbinom{n-i}{k-1} = \sum_{i=1}^{n-k+1}\sum_{j=1}^{n-k+1}\dbinom{n-j}{k-1}\\=\sum_{i=1}^{n-k+1}\sum_{j=k-1}^{n-i}\dbinom{j}{k-1} \\=\sum_{i=1}^{n-k+1} \dbinom{n-i+1}{k}\\=\sum_{i=k}^{n}\dbinom{i}{k} = \dbinom{n+1}{k+1}\]
于是:
\(F(n,k) = \frac{\dbinom{n+1}{k+1}}{\dbinom{n}{k}} = \frac {n+1}{k+1}\).
Q.E.D.
关于贪心的证明
那么问题就变成了:
给定数组\(a_i, b_i\),
\[\max \sum_{i=1}^n \frac{a_i+1}{b_i + 1}\].
我们证明, 给较大的\(a_i\)应搭配较小的\(b_i\).
对于\(0 \leqslant a_1 \leqslant a_2, 0 \leqslant b_1 \leqslant b_2\), 我们证明
\(a_1b_1 + a_2b_2 \leqslant a_1b_2 + a_2b_1\).
我们可以做差证明上面的式子.
那么我们可以使用证明贪心的常用方法,交换法(i.e. 冒泡排序法)来证明贪心的correctness.
算法
经过上面的推演,我们终于得到了这个问题的标算:
把b数组从小到大排序,a数组从大到小排序,一一对应即可.
然而,在比赛中,样例却直接给除了解法,令人遗憾.
比赛的时候推了很久,虽然早就知道贪心做法.
参考文献
朱世杰恒等式的应用-以CF841C为例的更多相关文章
- CodeChef - NWAYS 组合数 朱世杰恒等式
这道题目数据有坑,白浪费一个小时! 题意:求\(\sum_{i=1}^n\sum_{j=1}^n{|i-j|+k \choose k}\) 知识点: 朱世杰恒等式,\(\sum_{i=r}^n{i \ ...
- 2019.10.22 csp-s模拟测试82 反思总结
重来重来,刚刚就当什么都没发生 今天的题属实有些迷惑,各种意义上…总之都很有难度吧.不满归不满,这套题的确不是什么没有意义的题目. 为了考验自己的学习能力记忆力,决定不写题解,扔个代码完事了 其实是懒 ...
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...
- 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程
最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...
- UWP开发:APP之间的数据交互(以微信为例)
目录 说明 UWP应用唤醒方式 跟微信APP交互数据 APP之间交互数据的前提 说明 我们经常看到,在手机上不需要退到桌面,APP之间就可以相互切换,并且可以传递数据.比如我在使用知乎APP的时候,需 ...
- C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL
CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL +BIT祝威+悄悄在此留下版了个权的信息说: 开始 本文用step by step的方式,讲述如何使 ...
- Android 打开方式选定后默认了改不回来?解决方法(三星s7为例)
Android 打开方式选定后默认了改不回来?解决方法(三星s7为例) 刚刚在测试东西,打开一个gif图,然后我故意选择用支付宝打开,然后...支付宝当然不支持,我觉得第二次打开它应该还会问我,没想到 ...
- 数据库中树形列表(以easyui的tree为例)
构造一棵easyui前台框架的一个树形列表为例后台框架是spring MVC+JPA. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ...
随机推荐
- powerdesinger(MSSQLSRV2008测试通过)通过Name或comment 导出注释到sql脚本,生成sql的说明备注,包括表注释信息
导出字段信息name注释到sql2008字段的说明 在database -> edit current dbms -> MSSQLSRV2008::Script\Objects\Colum ...
- python中json.loads,dumps,jsonify使用
search_info = {'id':132,'user_role':3} print type(search_info) #输出 <type 'dict'> #转为string用dum ...
- python中的可变与不可变对象
Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
- vijos1059题解
题目: XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大 ...
- Oracle trunc()函数的用法--来着心静禅定ing
1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指 ...
- Java 异常处理笔记
Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...
- 【SqlServer系列】表连接
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]MYSQL安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 1.2 本篇 ...
- Android之RecyclerView入门
首先来实现最简单的列表展示,如图 在这个展示中,RecyclerView的作用仅限于回收和定位屏幕上的TextView,在用户滑动屏幕时,会把上一个视图回收掉,并显示下一个页面的视图,也就是回收再利用 ...
- tcp入门(唐唐的故事)
1,互联网的实现,分成好几层.每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持.把互联网分成五层,容易让人理解. 2,对这五层的理解(唐唐讲故事): 实体层:目的就是把计算机连接起来,用电气 ...
- c++动态内存管理
一.内存的简要了解 说到内存,很多人应该都多多少少有点了解了,我们在这再稍微多说几句: 一般我们可以把内存理解为三个部分:静态区,栈,堆.有些朋友搞不清到底什么是栈什么是堆,堆栈有多人会认为是堆和栈, ...