【组合数学】【P5520】[yLOI2019] 青原樱
A [yLOI2019] 青原樱
Background
星川之下皆萤火尘埃
我独行在人潮你天真而待
相遇若是借丹青着色
青原上 绯樱如海
——银临《青原樱》(Cover 人衣大人)
Description
给定 \(n\) 个位置,要求放下 \(m\) 个互不相同的东西,东西两两之间不能相邻,求方案数对 \(p\) 取模的结果。
Limitations

特殊性质1:保证对应测试点的实际方案数(在取模前)不超过 \(10^6\)
特殊性质2:保证 \(p\) 是一个质数。
对于 \(100\%\) 的数据,保证 \(1 \leq p \leq 10^9\),\(1 \leq m \leq \lceil \frac{n}{2} \rceil\)
Solution
子任务 \(1\):
显然 \(n = m = 1\),所以共有 \(1\) 种方案,但是直接输出 \(1\) 是没有分的,因为这个点的 \(p = 1\),应该输出 \(1 \bmod 1 = 0\)。
期望得分 \(5~pts\)
子任务 \(2\):
考虑方案数不超过 \(10^6\),因此只要在爆搜的时候保证搜索树上每个节点的情况都是合法的且他的后代一定至少存在一种合法的方案即可。考虑搜索树的最后一层节点数是 \(O(ans)\) 的,树共有 \(O(n)\) 层,因此总复杂度 \(O(n \times ans)\),期望得分 \(15~pts\)
子任务 \(3\):
数数题,考虑DP。
先不考虑幼苗的编号,设 \(f_{i, j}\) 为放了 \(i\) 个幼苗,第 \(i\) 个幼苗在位置 \(j\) 的方案数,转移显然:
\[f_{i, j} = \sum_{k = 0}^{j - 1}f_{i - 1,k}\]
初始化为 \(f_{0, 0} = 1\)。注意由于这里幼苗是互不相同的,因此算出答案以后要乘上 \(m!\)。
共有 \(O(nm)\) 个状态,每次转移是 \(O(n)\) 的,总复杂度 \(O(n^2m)\),期望得分 \(20~pts\)
子任务 \(4\):
考虑上面的转移方程显然可以对每个 \(i\) 维护一个前缀和来让转移变成 \(O(1)\),于是总复杂度 \(O(nm)\),期望得分 \(20~pts\)
子任务 \(5\):
DP看起来已经到了尽头,无论如何状态数都不可能低于 \(O(nm)\),于是考虑组合数学。
考虑将所有的方案分为两类:对于所有的第 \(n\) 个位置没有树苗的方案,归为第一类方案,有树苗的方案归为第二类方案。显然这两类方案囊括了所有可能的情况且互不相同。
先考虑第一种情况,第 \(n\) 个位置没有树苗。那么对于所有的 \(m\) 个树苗,显然每个树苗后面都紧跟着一个空位,如果将每个树苗和他后面的紧跟着的空位看作一个物品,那么问题就变成了共有 \((n - m)\) 个位置,在这 \((n - m)\) 个位置种选择 \(m\) 个位置,放上 \(m\) 个物品,摆放方式没有限制,求方案数。根据排列数的定义,共有 \(C_{n - m}^m\) 种方式。注意到这样求出的方案是 \(m\) 个物品相同的方案,由于要求 \(m\) 个物品互不相同的方案,答案应该乘上 \(m!\)。于是这种情况的方案数是 \(m! \times C_{n - m}^m\)。
再考虑第二种情况,第 \(m\) 个位置有树苗,那么对于前面的 \((n - 1)\) 个树苗,每个树苗后面都紧跟着一个空位,同样的我们将树苗和空位捆绑在一起看,那么不考虑最后一个树苗,问题变为有 \([(n - 1) - (m - 1) = n - m]\) 个位置,在这些位置种选择 \((m - 1)\) 个,共有 \(C_{n - m}^{m - 1}\) 种方式。注意到最后一个树苗的选择一共有 \(m\) 种情况,所以在 \(m\) 个树苗相同时的方案数应是 \(m \times C_{n - m}^{m - 1}\)。对于前面 \((m - 1)\) 个物品,有 \((m - 1)!\) 种排列方式,因此这种情况的总方案数为 \(m!~\times~C_{n - m}^{m - 1}\)
由于保证了模数 \(p\) 是一个质数,因此 \(O(n)\) 处理逆元后 \(O(n)\) 计算即可。期望得分 \(20~pts\)
子任务 \(6\):
如果你足够机智(划掉。如果你不像扶苏一样傻),你就可以发现第一种方案的方案数 \(m! \times C_{n - m}^m~=~A_{n - m}^m\),第二种方案的方案数 \(m! \times C_{n - m}^{m - 1}~=~m \times A_{n - m}^{m - 1}\)。所以根本不需要处理逆元,直接做即可。
当然,由于代数恒等式 \(A_x^y + y \times A_x^{y - 1} = A_{x + 1}^y\),可以直接求 \(A_{n - m + 1}^{m}\),时间复杂度 \(O(n)\),期望得分 \(20~pts\)。
【组合数学】【P5520】[yLOI2019] 青原樱的更多相关文章
- P5520 【[yLOI2019] 青原樱】
P5520 [[yLOI2019] 青原樱]题解 整理博客的时候改了下分类标签,重新审一下 题目传送门 翻了翻题解区,发现基本没和我写的一样的(主要是都比我的写的简单 看题目: 第一眼,数学题:第二眼 ...
- 洛谷P5520 【[yLOI2019] 青原樱】
这题是小学奥数啊. 题意:求\(m\)个不同物品两两不相邻的方案数. 直接排列组合. 我们可以减掉他们之间最少需要空出来的位数--\(m-1\)个空位 像这样,我们只用留\(m-1\)个空位放在每两个 ...
- asp.net MVC4——省市三级联动数据库
数据库设计
- 通用js地址选择器
用js实现通用的地址选择器,省份,城市,地区自动关联更新 点击下面查看详细代码: http://runjs.cn/code/s8sqkhcv 关键地址库代码: var addr_arr = new A ...
- java 随机生成身份证代码
import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.I ...
- 全国城市三级联动 html+js
全国城市三级联动,没有css,所以屏幕的自适应必须自己想办法,手机端慎用(最好不要用,因为有些我也说不出的展示问题). html页面 <!DOCTYPE html> <html> ...
- 省市级联.net
初学javascript,编译省市级联,使用json在一般处理程序中编译,利用ajax传递数据到web前台 <html xmlns="http://www.w3.org/1999/xh ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
- react 写的省市三级联动
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Ba ...
随机推荐
- 奥展项目笔记01--不同网站,点击工具--开发人员工具F12,显示的页面怎么不一样
开发人员工具F12,显示的页面不一样: 样式1: 样式2: 解决方案:兼容模式和极速模式的开发者工具不一样,改成极速模式就ok了.
- Java 中要将 String 类型转化为 int 类型
在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...
- Java 8创建Stream流的5种方法
不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...
- asp.net SQLite关于各版本的调试
最近想做一个简版的管理系统,将SQL SERVER数据库切换到SQLite数据库中,采用的是SQLite3的版本数据库. 开发工具:SV2015 UP3 数据库:SQLite3 项目整体结构图 相同的 ...
- SQL查询数据库中所有表、表字段名及数据类型
select b.name,a.colid,a.name ,())+')' from systypes where a.xusertype=systypes.xusertype ) type from ...
- Qt 字符串截取 获取指定字符位置
获取字符在字符串中的位置 QString str = "AT+LOC+LOCATION: 115.850441,33.004833"; QString s = "LOC& ...
- logger(一)slf4j简介及其实现原理
一.slf4j简介 slf4j(Simple logging facade for Java)是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体 ...
- rac启动维护笔记
Ohasd.bin将产生4个代理启动相关的资源 (1) oraagent:负责ora.asm.ora.evmd.ora.gipcd.ora.gpnpd.ora.mdnsd的启动和管理 (2) ...
- MySQL修炼之路一
1. MySQL概述 1. 什么是数据库 存储数据的仓库 2. 都有哪些公司在用数据库 金融机构.游戏网站.购物网站.论坛网站 ... ... 3. 提供数据库服务的软件 1. 软件分类 MySQL. ...
- ssh免密登录(公钥私钥)指令
1.在.ssh目录中执行ssh-keygen -t rsa命令生成两个秘钥,公钥(id_rsa.pub)和私钥(id_rsa) 2.ssh-copy-id -i id_rsa.pub 对方用户名@对方 ...