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] 青原樱的更多相关文章

  1. P5520 【[yLOI2019] 青原樱】

    P5520 [[yLOI2019] 青原樱]题解 整理博客的时候改了下分类标签,重新审一下 题目传送门 翻了翻题解区,发现基本没和我写的一样的(主要是都比我的写的简单 看题目: 第一眼,数学题:第二眼 ...

  2. 洛谷P5520 【[yLOI2019] 青原樱】

    这题是小学奥数啊. 题意:求\(m\)个不同物品两两不相邻的方案数. 直接排列组合. 我们可以减掉他们之间最少需要空出来的位数--\(m-1\)个空位 像这样,我们只用留\(m-1\)个空位放在每两个 ...

  3. asp.net MVC4——省市三级联动数据库

    数据库设计

  4. 通用js地址选择器

    用js实现通用的地址选择器,省份,城市,地区自动关联更新 点击下面查看详细代码: http://runjs.cn/code/s8sqkhcv 关键地址库代码: var addr_arr = new A ...

  5. java 随机生成身份证代码

    import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.I ...

  6. 全国城市三级联动 html+js

    全国城市三级联动,没有css,所以屏幕的自适应必须自己想办法,手机端慎用(最好不要用,因为有些我也说不出的展示问题). html页面 <!DOCTYPE html> <html> ...

  7. 省市级联.net

    初学javascript,编译省市级联,使用json在一般处理程序中编译,利用ajax传递数据到web前台 <html xmlns="http://www.w3.org/1999/xh ...

  8. Android 三级联动选择城市+后台服务加载数据库

    技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...

  9. react 写的省市三级联动

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Ba ...

随机推荐

  1. FormData使用详解

  2. sprintboot动态静态资源转发

    背景|     要做一个功能,根据规则服务器上创建文件后,返回可下载的链接           因为sprintboot中地址需要先在用@RequestMapping定义好,否则解析不了,这时动态生成 ...

  3. 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。

    网站部署到IIS提示Microsoft.Web.Infrastructure,未能加载 解决方案 使用nuget安装 Microsoft.Web.Infrastructure拷贝到bin目录下面

  4. centos7 配置nginx vim语法高亮

    看了Nginx核心知识100讲,按照他的做法,没有配置成功,可以使用下面的方法: 下载nginx源码,http://nginx.org/en/download.html 这里下载的是:nginx-1. ...

  5. PIESDK二次开发基础视频

    第0讲:PIESDKNet二次开发环境配置 第1讲:PIE产品简介及开发介绍 第2讲:PIE架构及常用控件介绍 第3讲:PIESDK常用功能实践 第4讲:XML插件配置及组件式开发界面搭建 第5讲:地 ...

  6. Java NIO学习系列一:Buffer

    前面三篇文章中分别总结了标准Java IO系统中的File.RandomAccessFile.I/O流系统,对于I/O系统从其继承体系入手,力求对类数量繁多的的I/O系统有一个清晰的认识,然后结合一些 ...

  7. codeforces #577(Div.2)

    codeforces #577(Div.2) A  Important Exam A class of students wrote a multiple-choice test. There are ...

  8. RabbitMQ高级面试题

    本文涉及:投递失败的消息怎么处理.如何实现延时队列.如何指定消息的优先级.消息的持久化是如何实现的.如何保证消息不丢失 投递失败的消息怎么处理 首先投递失败存在如下两个情况 当交换器无法根据自身的类型 ...

  9. ES6 数组的拓展(五)

    一.扩展运算符(...)将数组转化为以,分割的字符串eg: console.log(...[1,2,3,4]); //1 2 3 4 将字符串转化为数组eg: console.log([...'hel ...

  10. "轻"量级 Java Web 服务框架漫谈

    博文太长了, 还是先说下概要: 框架"轻量"与否可以从两方面来看待: 1) 框架本身的体量 - 例如小 jar 无依赖的苗条框架; 2) 用户使用框架是否获得各种便利而无阻隔(&q ...