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. python做一个简易图片下载工具

    代码有点乱,先这样 # -*- coding:utf-8 -*- #__author__ :kusy #__content__:文件说明 #__date__:2018/11/01 11:01 impo ...

  2. 集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)

    HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树. put操作 final V putVal(int hash, K key, V v ...

  3. R语言构建蛋白质网络并实现GN算法

    目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...

  4. SQLServer之Case用法

    定义 计算条件列表,并返回多个可能的结果表达式之一. 表达式类型 case具有两种格式: 简单case表达式,它通过将表达式与一组简单的表达式进行比较来确定结果. case搜索表达式,它通过计算一组布 ...

  5. H5 选择图片上传及预览

    <div class="sctp"> <img src="img/sczp.png" id="photo" alt=&qu ...

  6. sedlauncher.exe 磁盘爆满

    打开应用和功能,搜KB4023057,然后卸载. 快捷键WIN+R打开运行,输入services.msc回车打开系统服务,找到Windows Remediation Service (sedsvc)和 ...

  7. Flask路由系统

    Flask路由系统 我们之前了解了路由系统是由带参数的装饰器完成的. 路由本质:装饰器和闭包实现的. 设置路由的两种方式 第一种: @app.route('/index') def index(): ...

  8. Eureka重要对象简介

    在进行分析EurekaClient和EurekaServer之间通信的源码之前,我们首先需要熟悉一下几个实体类 InstanceInfo 这个类代表着EurekaClient实例,客户端向服务端请求注 ...

  9. netty框架概述

    概述 最近在学习netty的相关知识,也在看netty的源码,光看不练假把式,所以也正好利用自己学习的机会写几篇netty的分析文章,主要还是一些源码解析的文章,一方面有输出会促使自己在看源码,学习原 ...

  10. swagger页面详细讲解