朱世杰恒等式的应用-以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. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ... 
随机推荐
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
			前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ... 
- RedHat安装中文支持和字体
			操作系统: Red Hat Enterprise Linux 6.3 x86 安装中文语言支持: yum install "@chinese support" 安装完中文支持后,可 ... 
- 快速查询List中指定的数据
			时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ... 
- Maven学习专题--Maven入门及安装
			因为项目需要,新项目需要使用Maven开发,但是组内大部分没有接触过maven.我就毅然承担搭建maven环境的任务了.因为一切重头开始,就想把自己的整个搭建环境.项目创建.框架整合和模块管理整个过程 ... 
- Redis源码阅读之主从复制——Slave视角
			Redis主从复制 为了提高性能和系统可用,Redis都会做主从复制,一来可以分担主库压力,二来在主库挂掉的时候从库依旧可以提供服务.Redis的主从复制是异步复制,返回结果给客户端和同步命令到从库是 ... 
- 在ubuntu下使用minicom连接交换机/路由器Console口
			首先下载并安装minicom sudo apt-get install minicom 然后将Console线一端连上交换机的Console口,另一端连上电脑(我这里是通过USB口连接的) 然后查看对 ... 
- java三大框架介绍
			常听人提起三大框架,关于三大框架,做了如下了解: 三大框架:Struts+Hibernate+Spring java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它 ... 
- SVN常见问题
			one or more files are in a conflicted state.(一个或多个文件处于矛盾状态)意思是这个文件已经被其他人修改过了. 然后我点击ok按钮后,找到冲突的文件再次up ... 
- 操作系统,银行家算法模拟实现(Windows 环境 C++)
			计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ... 
- django 表单提交 post 、get
			介绍 : django项目开发必须懂的知识点,下面使用的数据库是mysql , models.py 数据库表结构, # -*- coding: utf-8 -*-from __future__ im ... 
