[ARC138E] Decreasing Subsequence

[ARC138E] Decreasing Subsequence

题意

给出 \(3\leq n \leq 5000,2\leq k \leq (n+1)/2\),对所有长度为 \(n\) 的满足 \(0\leq a_i \leq i\) 且正数项两两不同的序列 \(a\),求长度为 \(k\) 的元素非 \(0\) 的下降子序列个数之和。

思路

先刻画序列。

对所有 \(a_i\) 减去 \(1\),新的序列是 \(a'\)

对于所有 \(a_i'\neq -1\),必须有 \(a_i'<i\)。连接一条 \(i \to a_i'\) 的边,满足这条边必须方向向前。而且由于所有非负整数互不相同,建出来的图必须是若干条不相交的链。

比如下面酱子,就是一个合法的 \(a'\) 了。


接下来刻画下降子序列

下降子序列 \(\{s_i\}\),必须满足这些点有出边,而且它们的出边刚好形成一个像彩虹一样的包含形状。

比如上图中标黄色和标黑色分别就是其中两组合法子序列。


合法的连边方案和合法的序列是双射。我们要对每个合法的连边方案计算有多少长度为 \(k\) 的合法子序列。

子序列的刻画太难拍成状态了,不好算。于是我们转为算每种合法的大小为 \(k\) 的“彩虹”连边有多少合法的连边方式吧。这好啊,还不用考虑算重,因为每种不同的子序列出现在同一个序列里面,你也得分别算贡献的。

对于一组彩虹边,起点有 \(k\) 个,分别是 \(s_1 \sim s_k\),终点也有 \(k\) 个,分别是 \(t_1 \sim t_k\)。计算序列个数。每个 \(s_i\) 可以向后连长度任意的链,每个 \(t_i\) 可以向前连长度任意的链。剩下没有被用到的点,可以随便分成任意条链。

枚举 \(l\) 表示终点和终点连的链的点的个数,\(r\) 表示起点和起点连的链的点的个数。\(n \brace m\) 是第二类斯特林数的意思。

答案是:(\(n+1\) 是因为图里面还有 \(0\) 号点)

\[\sum_{l=k} \sum_{r=k}^{l+r\le n+1} \binom{n+1}{l+r} {l \brace k} {r \brace k} f_{n+1-l-r}\\ f_i = \sum_{x=1}^i {i \brace x} \]

解释一下组合意义:上面那条就是在 \(n+1\) 个点里面,选出 \(l+r\) 个点,并且左边分 \(l\) 个,右边分 \(r\) 个,左右都分别分成 \(k\) 条链,每条链上点的顺序和链于链之间的顺序都是按照编号有序的。\(f_i\) 就表示剩下 \(i\) 个点分成任意组链的方案数。

预处理第二类斯特林数,预处理 \(f_i\)。时间复杂度 \(O(n^2)\)

code

代码好写啊。

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace hesitate {constexpr int N=5e3+7,Max=5e3+1,mod=1e9+7;int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }void _add(int &a,int b) { a=add(a,b); }int mul(int a,int b) { return 1ll*a*b%mod; }void _mul(int &a,int b) { a=mul(a,b); }int ksm(int a,int b=mod-2) {int s=1;while(b) {if(b&1) _mul(s,a);_mul(a,a);b>>=1;}return s;}int s[N][N],f[N],fac[N],ifac[N];int n,k;void init() {s[0][0]=1;rep(i,1,Max) rep(j,1,i) s[i][j]=add(s[i-1][j-1],mul(j,s[i-1][j]));f[0]=1;rep(i,1,Max) rep(j,1,i) _add(f[i],s[i][j]);fac[0]=1;rep(i,1,Max) fac[i]=mul(fac[i-1],i);ifac[Max]=ksm(fac[Max]);per(i,Max-1,0) ifac[i]=mul(ifac[i+1],i+1);}int C(int n,int m) { return mul(fac[n],mul(ifac[m],ifac[n-m])); }int ans;void main() {sf("%d%d",&n,&k);init();rep(l,k,n+1-k) rep(r,k,n+1-l) {_add(ans,mul(C(n+1,l+r),mul(mul(s[l][k],s[r][k]),f[n+1-l-r])));}pf("%d\n",ans);}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifhesitate :: main();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依框架(ruoyi-master)——13.Nacos,使用服务注册和服务诶只

若依(Ruoyi)框架中如何使用Nacos?若依框架的微服务版项目启动 Nacos下载和启动 Nacos服务注册和配置接下来,我们可以查看若依框架微服务版如何使用Nacos? 前提JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7版本)\Redis >= 3.0 Maven >= 3.0 Node >= 1…

芯片半导体基础(一):真空二极管、三极管工作原理

liwen01 2025.01.05 前言 半导体的前身是真空管,在集成电路被发明前,真空管被广泛应用于收音机、电话、无线电、雷达、电视、电子计算机等电子设备中。 真空管也叫电子管,在不同的资料中称呼可能不一样,这里我们统称为真空管。 因为翻译的原因,Triode 三极管实际指代的是真…

人类讨厌AI的缺点,其实自己也有,是时候反思了。

马特科拉默摄于Unsplash前言:人类讨厌AI,其实就是讨厌自己! 如果你问一些人对人工智能的看法,你可能会听到诸如不道德、偏见、不准确甚至操纵这样的词语。 人工智能因为种种原因正备受批评。它让一些人类的任务变得无用,甚至可能导致工作岗位的消失。和往常一样,富人通过…

掌握设计模式--桥接模式

桥接设计模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立地变化。这种模式特别适合于需要在多个维度上扩展的场景,避免了类爆炸(类的数量随着组合需求呈指数级增长)的情况。 核心思想抽象部分:定义对象的主要功能或者高层操作…

集训记录 1.7

集训记录 1.7 感觉最近效率好低啊。 打了几场省选模拟赛,几乎都垫底了。 主要是图论,贪心和博弈,其他的没怎么写,感觉DP以后有必要补,字符串和网络流暂时放一放。 【模板】最大流 EK和Dinic都学了,后者写的比较熟。Dinic #include<bits/stdc++.h> using namespace …

读数据保护:工作负载的可恢复性29新式的数据保护方案

新型数据保护方案1. 新式的数据保护方案 1.1. 产品都是围绕着磁盘设计的1.1.1. 许多产品只支持磁盘,另一些虽然支持磁带,但仍然是以磁盘为主的1.1.2. 产品都把磁盘作为首要的备份目标(而且通常只支持把数据备份到磁盘上)​1.2. 除了以磁盘为中心,这些产品还有一个共同之处…

WPF 测试 GlyphTypeface 的 Baseline 行为

本文将对 WPF 进行 GlyphTypeface 的 Baseline 行为测试。经过测试发现行为非常符合预期,这个值乘以字号就是基线本文内容里面只给出关键代码片段,如需要全部的项目文件,可到本文末尾找到本文所有代码的下载方法 前置博客: WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本大飞…

OpenVX功能参数分析

3. 节点参数节点创建函数的参数定义为原子类型,如vx_int32、vx_enum,或对象,如vx_scalar、vx_image。框架应将节点创建功能的原子变量转换为vx_scalar引用,供节点使用。vx_scalar类型的节点参数,可以在图形执行期间更改;而如果改变原子类型的节点参数(vx_int32等),则至…

OpenVX参数节点执行独立性

8.节点执行独立性 在如图2-5所示例中,客户端根据输入图像、梯度幅度和梯度相位。OpenVX并不要求并行运行,但可以由OpenVX供应商实现。 图2-5 具有一些独立节点的简单图形。 构造这种图形的代码,如下所示。 vx_context context = vxCreateContext(); vx_image images[] = {…

4书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

BOF编写-修改时间戳

模板配置 跟着网上的教程使用evilashz师傅的模板,下载模板解压至vs的模板目录: %UserProfile%\Documents\Visual Studio 2022\Templates\ProjectTemplates​​ 创建新项目选择刚刚新增的类型:Beacon Object File​。 ​​ ‍ 环境适配 生成时报错,我使用的是2022版本的,模…

【分布式系统】 分布式调度 设计,要考虑 哪些问题?

一、分布式调度框架的核心功能二、什么是 任务调度 ?三、什么是分布式 任务调度 ?四、分布式调度框架的主要功能五、分布式调度框架的核心业务场景六、分布式任务调度的核心组件七、分布式任务调度的架构模式八、常见的分布式调度框架包括九、XXL-Job的工作流程十、 Quartz 的…