Subpermutation-2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)-1008

好久没写过题解了,模了好长时间的题终于过了,由此写篇题解。
题目链接
题意就不详细说明了。
反思

这题模了好长时间主要是因为我中间感觉太难了就去奖励自己了^_^,大家千万不要向我学习。看到这题就应该思考这个序列与它下一个产生的序列有什么关系,存在关系进行排列组合公式推导理清思路就好。

接下来开始分类讨论。

  • 第一种情况也就是最简单的情况先考虑由每个单独 n n n元排列而产生的 m m m元排列,通俗的讲也就是单独的 n n n元排列对答案做出的贡献。
    p 1 , p 2 , … , p n p_1,p_2,\dots,p_n p1,p2,,pn中出现的 p 1 , p 2 , … , p m p_1,p_2,\dots,p_m p1,p2,,pm
    做出的贡献为 m ! ∗ ( n − m + 1 ) ! m!*(n-m+1)! m!(nm+1)!

其实很简单也就是将 m m m元排列当成一个整体,这个整体自己进行全排列也就是 m ! m! m!而剩下的元素再加上这个 m m m元排列也就是 ( n − m + 1 ) (n-m+1) (nm+1)个元素这些元素随意排列的方案数也就是 ( n − m + 1 ) ! (n-m+1)! (nm+1)!,两种方式分步进行也就是 m ! ∗ ( n − m + 1 ) ! m!*(n-m+1)! m!(nm+1)!

  • 第二种情况比较复杂也很容易想到也就是两个 n n n元排列的首尾对答案做出的贡献
    下面我们应该分析这个 n n n排列与与下一个 n n n元排列存在这什么恶心关系呢?
    最开始是这样一个 n n n元排列 p 1 < p 2 < p 3 < ⋯ < p n p_1<p_2<p_3<\dots<p_n p1<p2<p3<<pn
    它最终的形式应该是这样的
    p 1 > p 2 > p 3 > ⋯ > p n p_1>p_2>p_3>\dots>p_n p1>p2>p3>>pn
    通过打表或者是其他的分析而得(我是打表
    在一个 n n n元排列里面存在最后一个 < < <关系的 p k < p k + 1 p_k<p_{k+1} pk<pk+1这个 p k p_k pk要被这个排列从后往前数第一个比它大的数替换然后整体倒着来。
    比如一个 n n n元排列是这样的 p 1 < p 2 > p 3 < p 4 < ⋯ < p k < p k + 1 > ⋯ > p j > ⋯ > p n p_1<p_2>p_3<p_4<\dots<p_k<p_{k+1}>\dots>p_j>\dots>p_n p1<p2>p3<p4<<pk<pk+1>>pj>>pn
    假设 p j p_j pj是从右往左数第一个比 p k p_k pk大的元素
    它的下一个排列必然是
    p 1 < p 2 > p 3 < p 4 < ⋯ < p j > p n < p n − 1 < ⋯ < p j + 1 < p k < p j − 1 < ⋯ < p k + 1 p_1<p_2>p_3<p_4<\dots<p_j>p_n<p_{n-1}<\dots<p_{j+1}<p_k<p_{j-1}<\dots<p_{k+1} p1<p2>p3<p4<<pj>pn<pn1<<pj+1<pk<pj1<<pk+1

其实这样铁是对的因为你再保留之前得 > > >得基础上一直将 > > >往前移,这个过程什么时候停止呢,那也就是没有 < < <得时候,那也就是排列结束的时候。

那你肯定有个 p i p_i pi m m m元排列的起始点

    • 再进行分类讨论当 i ≤ k i\leq k ik
      单独讨论这个排列
      p i … p k , p k + 1 , p k + 2 , … , p j , … , p n , p 1 , p 2 … p i + m − 1 − n p_i\dots p_k,p_{k+1},p_{k+2},\dots,p_j,\dots,p_n,p_1,p_2\dots p_{i+m−1−n} pipk,pk+1,pk+2,,pj,,pn,p1,p2pi+m1n

那也就是将序列分成两段分析 i − n i-n in是前一个 n n n元排列所构成的一部分,后面那前 ( m − ( n − i + 1 ) ) (m-(n-i+1)) (m(ni+1))项也就是后一个 n n n元排列所构成的首先呢还是除了这 m m m项其他随便排是一个 ( n − m ) ! (n-m)! (nm)!,本来呢这 m m m项也是随便排但是不要忘了构成这个排列的条件就是存在 p k < p k + 1 > p k + 2 p_k<p_{k+1}>p_{k+2} pk<pk+1>pk+2所以前一部分它不能是单调递增的要减去这个情况那也就是 m ! − C m n − i + 1 ∗ ( ( m − ( n − i + 1 ) ) ! ) m!-C_m^{n-i+1}*((m-(n-i+1))!) m!Cmni+1((m(ni+1))!)

    • 而当 i ≥ ( k + 1 ) i\geq (k+1) i(k+1)

因为 p j > p k p_j>p_k pj>pk是前提条件而且这是 n n n元排列里最小的 m m m个数,所以从逻辑上来看你有 p j p_j pj 必然有 p k p_k pk 但是这又和我们分类讨论的情况不一样所以得出 i + m − 1 − n < j i+m-1-n<j i+m1n<j,然后这 m m m 个数随便排也就是 C m n − i + 1 ∗ ( m − ( n − i + 1 ) ) ! C_m^{n-i+1}*(m-(n-i+1))! Cmni+1(m(ni+1))! ,剩下 n − m n-m nm 随便排也就是 ( n − m ) ! (n-m)! (nm)!但是要减去一种情况也就是剩下的数全递减的情况违反了找不到这个 k k k 的前提。

讨论完毕。
最后答案化简得
( m − 1 ) ∗ m ! ∗ ( n − m ) ! − m ! ∗ ∑ i = 1 m − 1 1 i 2 (m-1)*m!*(n-m)!-m!*\sum_{i=1}^{m-1}{1\over{i^2}} (m1)m!(nm)!m!i=1m1i21

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值