【学习笔记】CF1264D2 Beautiful Bracket Sequence (hard version)
考虑固定一种计算贡献的方式,从而构造组合意义。
问题接踵而至。如何计算 ( i , j ) (i,j) (i,j)在所有方案中产生贡献的次数?从内往外考虑,那么要求 [ l , i ] [l,i] [l,i]中的左括号和 [ j , r ] [j,r] [j,r]中的右括号数目相等,不难发现这个限制是充要的。又因为问的就是整个序列的权值,所以设 [ 1 , i ] [1,i] [1,i]中有 a a a个问号, [ j , n ] [j,n] [j,n]中有 b b b个问号,左右括号相差的数目为 k k k,那么方案数 ∑ i ≤ a ( a i ) ( b i − k ) = ∑ i ≤ a ( a a − i ) ( b i − k ) = ( a + b a − k ) \sum_{i\le a}\binom{a}{i}\binom{b}{i-k}=\sum_{i\le a}\binom{a}{a-i}\binom{b}{i-k}=\binom{a+b}{a-k} ∑i≤a(ia)(i−kb)=∑i≤a(a−ia)(i−kb)=(a−ka+b),显然如果对组合数比较熟悉的话是不难推出这个式子的。注意, [ i , j ] [i,j] [i,j]这段序列长什么样子事实上并不影响答案。
怎么优化这个枚举过程呢?显然是固定左端点,唯一需要注意的细节是当左右两边的问号都被确定时,此时右端点的选取是唯一的,也就是说恰好对应一种方案,那么将等号改成不等号就有: ∑ i ≤ a ∑ j ≥ i − k ( b j ) ( a i ) \sum_{i\le a}\sum_{j\ge i-k}\binom{b}{j}\binom{a}{i} ∑i≤a∑j≥i−k(jb)(ia),我们希望 j j j从 0 0 0开始枚举,因此不妨变一下形式: ∑ i ≤ a ∑ j ≥ 0 ( b i − k + j ) ( a a − i ) \sum_{i\le a}\sum_{j\ge 0}\binom{b}{i-k+j}\binom{a}{a-i} ∑i≤a∑j≥0(i−k+jb)(a−ia),交换求和顺序就有: ∑ j ≥ 0 ∑ i ≤ a ( b i − k + j ) ( a a − i ) = ∑ j ≥ 0 ( a + b a − k + j ) \sum_{j\ge 0}\sum_{i\le a}\binom{b}{i-k+j}\binom{a}{a-i}=\sum_{j\ge 0}\binom{a+b}{a-k+j} ∑j≥0∑i≤a(i−k+jb)(a−ia)=∑j≥0(a−k+ja+b),注意到 a + b a+b a+b是定值,于是就做完了。
复杂度 O ( n ) O(n) O(n)。
感觉组合数的运算还是比多项式要轻量级的。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17529954.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」